0. 像是Java编译器(Javac)的一个插件
JSR 经委员会审核通过的Java规范提案 by CSDN-青衣宋词
JSR 269 编译时API by CSDN-ni_hao_fan
Javac 抽象语法树 AST by 简书-zl_adams
深入理解Lombok by CSDN-Steafan_
jsr269抽象语法树操作API编译期注解处理-简单demo by 简书-东南枝下
1. Java Specification Requests 269
实际上JSR 269不仅仅提供了插件化处理注解的API
它建立了Java 语言本身的一个模型,它把method、package、constructor、type、variable、enum、annotation等Java语言元素映射为Types和Elements,从而将Java语言的语义映射成为对象,我们可以在javax.lang.model包下面可以看到这些类
我们可以利用JSR 269提供的API来操作AST来构建一个功能丰富的元编程环境
这里以Lombok的实现原理为例,抽象一下JSR 269的API在javac的注入
执行顺序就如上图的叠放顺序
2. Abstract Syntax Tree
如上所述,我们可以通过AST的API在javac的编译源码(.java)生成二进制文件(.class)过程中对源码进行操作
2.1 Parse and Enter:将源码按结构parse成一颗语法树(AST),enter到编译器的符号表
符号表是由一组符号地址和符号信息构成的表格
2.2 Annotation Processing:基于Pluggable Annotations Processing API对AST增删改查
如lombok注解,操作AST的API即Pluggable Annotations Processing API
2.3 Analyse and Generate:将AST、符号表analyse成字节码,输出到.class
还发生了下列过程:
检查语法
转换语法(泛型擦除、装拆箱、等等的语法糖)
3. lombok
lombok的插件是用来解决IDE对使用Lombok注解的代码的报错的(这里说的“插件”不是.pom中的<plugin>,是安装到IDE的插件)
3.1 常用注解
@Cleanup
@Data
@Slf4j
@Builder
支持构建父类属性的@SuperBuilder
@SneakyThrows
作用相当于编译后自动在方法外套一层try{…}catch(Throwable t){throw t;}