Lombok是一款通过注解在Java编译期生成代码的工具,通过使用其内置的一些注解如@Getter, @Setter等,可以在编译期间生成getter,setter,构造器,builder等代码,效果如下:
如图,通过@Data注解,lombok为MatchingCriteria类生成了Getter,Setter,hashcode,equals等方法;通过@AllArgsConstructor注解为MatchingCriteria类生成了全参构造器,@NoArgsConstructor注解为MatchingCriteria类生成了无参构造器。
1. Lombok原理
Lombok通过添加注解的方式来生成代码,在Jdk1.5引入注解的同时,也引入了两种解析注解的方式:1. 运行时通过反射解析 2. 编译时期解析
1.1 运行时解析注解
运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样可以通过反射获得该注解。以下是常用的解析注解的api:
boolean isAnnotationPresent(Class annotationClass); T getAnnotation(Class annotationClass); Annotation[] getAnnotations();
1.2 编译时解析注解
编译时解析注解主要有两种方式:Annotation Processing Tool以及Pluggable Annotation Processing API。
1.2.1 Annotation Processing Tool
APT来自JDK5, JDK7中不推荐使用,JDK8中已经彻底删除了。从JDK1.6以后,可以使用Pluggable Annotation Processing API来代替它。APT被废弃的主要原因如下:
1. APT集成在com.sun.mirror非标准包下
2. 没有集成到javac中,需要额外运行
1.2.2 Pluggable Annotation Processing API
JSR 269在JDK6中被引入,作为APT的替代方案。javac执行的时候会调用Pluggable Annotation Processing API,因此我们可以通过实现此API来改变编译期的一些行为从而达到目的。具体的编译流程如下:
举例来说,现在有一个实现了Pluggable Annotation Processing API的程序A,那么使用javac编译时的具体流程如下:
1. javac编译器对源码进行分析,生成一个抽象的语法树(AST)
2. javac编译器运行A程序
3. A程序完成逻辑,一般是修改此语法树
4. javac使用修改后的语法树生成可执行的字节码文件
Lomok便是通过Pluggable Annotation Processing API来实现代码生成的。