0

0

Java编译过程_Java源代码编译阶段详解

月夜之吻

月夜之吻

发布时间:2026-01-24 12:53:02

|

865人浏览过

|

来源于php中文网

原创

javac默认编译流程共七个关键阶段:Parse(词法语法分析生成AST)、Enter(构建符号表)、Process(注解处理)、Attribution(类型与语义检查)、Flow(控制流分析)、Desugar(语法糖降级)、Generate(字节码生成)。

java编译过程_java源代码编译阶段详解

Java 源代码编译不是简单地把 .java 文件“翻译”成 .class 文件,而是一套分阶段、带语义检查的流程;直接用 javac 命令看似一步完成,背后实际包含词法分析、语法解析、符号表构建、注解处理、字节码生成等多个逻辑阶段。

javac 的默认编译流程分哪几个关键阶段

javac 启动到输出 .class,核心阶段包括:

  • Parse:读入源码,做词法和语法分析,生成抽象语法树(AST),此时只检查基础语法(如括号是否匹配、if 后是否跟括号)
  • Enter:将类、方法、字段等符号填入符号表,建立作用域关系;此阶段失败会报 cannot find symbol
  • Process:运行注解处理器(如 Lombok、MapStruct 的 @Data@Mapper),可能生成新源文件或修改 AST
  • Attribution:类型检查与语义分析,确认变量类型、方法重载、泛型擦除后是否合法;incompatible typesbad operand types 都在此阶段抛出
  • Flow:控制流分析,检查变量是否初始化、是否可达、是否有 unreachable code
  • Desugar:将高阶语法糖(如 lambda、try-with-resources、switch 表达式)降级为 JVM 支持的字节码结构
  • Generate:遍历 AST,生成符合 JVM 规范的 .class 字节码(含常量池、字段/方法表、Code 属性等)

为什么加了 -Xlint 能发现更多问题

-Xlint 不是开启新阶段,而是让 AttributionFlow 阶段启用更严格的检查规则。默认情况下,很多潜在问题(如未使用的变量、过时 API 调用、序列化 UID 缺失)被静默忽略。

  • javac -Xlint:all 会报告所有可检测的警告,比如 serial(缺少 serialVersionUID)、fallthrough(switch 中漏写 break
  • -Xlint:-unchecked 可关闭某类警告,但要注意:关闭 unchecked 不会跳过泛型类型擦除检查,只是不提示“未经检查的转换”这类信息
  • 部分 -Xlint 提示(如 dep-ann)依赖源码中是否存在 @Deprecated 注解,不是仅靠字节码推断

编译时报错 “class file for XXX not found” 是哪个阶段的问题

这是 Enter 阶段失败的典型表现——符号表构建时找不到依赖类的定义。它和运行时的 NoClassDefFoundError 容易混淆,但发生时机完全不同。

rebuild库存生产管理系统3.9.5
rebuild库存生产管理系统3.9.5

rebuild是一款高度可配置化的企业管理系统!可免费商用!低代码/零代码快速搭建企业中台、OA办公自动化、CRM客户关系管理、WMS库存管理、TMS运输管理、SCM供应链管理,甚至是 ERP 企业资源计划!REBUILD 侧重于业务需求实现,而非基础技术框架或项目启动模板,通过 REBUILD 可以真正实现零代码快速搭建,无需编程、无需编译代码,甚至无需了解技术。 使用开始使用 REBUIL

下载

立即学习Java免费学习笔记(深入)”;

  • 常见原因:类路径(-cp-classpath)没包含该类所在的 JAR 或目录;或模块路径(--module-path)未正确配置模块依赖
  • 注意:即使该类在运行时可通过 classloader 加载,编译期也必须显式可见;javac 不会去扫描整个 lib/ 目录猜依赖
  • 若用 Maven,确保 compile scope 的依赖已正确声明;IDE 中有时缓存了旧 classpath,需刷新项目(如 IntelliJ 的 Reload project

真正影响编译结果的,不是你写了什么语法,而是符号表怎么建、类型怎么推、注解怎么展开;很多“明明能跑通却编译不过”的问题,根源都在 EnterAttribution 阶段的隐式约束上。

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

845

2023.06.15

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

743

2023.07.05

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

740

2023.07.31

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

397

2023.08.01

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

400

2023.08.02

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

447

2023.08.02

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

431

2023.08.02

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

16947

2023.08.03

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.8万人学习

C# 教程
C# 教程

共94课时 | 7.5万人学习

Java 教程
Java 教程

共578课时 | 50.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号