知识手册里写的 仿佛我从来没学过一样 有点沉不下心来看 整理一下 笔记
从Javac代码的总体结构来看,编译过程大致可以分为1个准备过程和3个处理过程,它们分别如下所示。
1. 准备过程:初始化插入式注解处理器。
2. 解析与填充符号表过程,包括:
- 词法、语法分析,将源代码的字符流转变为标记集合,构造出抽象语法树。
- 填充符号表,产生符号地址和符号信息。
3. 插入式注解处理器的注解处理过程:
- 在Javac源码中,插入式注解处理器的初始化过程是在 ** initPorcessAnnotations() ** 方法中完成的,而它的执行过程则是在processAnnotations()方法中完成。这个方法会判断是否还有新的注解处理器需要执行,如果有的话,通过JavacProcessing-Environment类的 doProcessing() 方法来生成一个新的JavaCompiler对象,对编译的后续步骤进行处理。
4. 分析与字节码生成过程,包括:
- 标注检查,对语法的静态信息进行检查。
- 数据流及控制流分析,对程序动态运行过程进行检查。
- 解语法糖,将简化代码编写的语法糖还原为原有的形式。
- 字节码生成,将前面各个步骤所生成的信息转化成字节码。
上述3个处理过程里,执行插入式注解时又可能会产生新的符号,如果有新的符号产生,就必须转回到之前的解析、填充符号表的过程中重新处理这些新符号,从总体来看,三者之间的关系与交互顺序如图所示。