基于 JSR 269 Pluggable Annotation Processing API 的一套语法糖工具,编译期修改抽象语法树后生成字节码。

注解使用列表:

@Data 组合注解,结合了 @Getter, @Setter, @RequiredArgsConstructor ,@ToString @EqualsAndHashCode @Value

@Getter 用于生成 getter 方法
@Setter 用于生成 setter 方法
@NoArgsConstructor 生成无参构造方法
@AllArgsConstructor 使用所有域生成构造方法
@RequiredArgsConstructor 将根据使用了 final 进行修饰的域或是使用了类似于 @NonNull 进行修饰的域生成构造方法
@ToString 根据相关属性生成类 Json 格式的 toString 方法
@EqualsAndHashCode 生成 equals 和对应的 hashCode 方法
@Builder 使用构造器模式生成 build 方法
@Default 配合 @Builder 使用
@Value 生成不可变对象
@NonNull 使用此注解的属性,lombok 将自动进行空值检查
@Cleanup 在做文件流(或是其他资源)相关操作时,使用此注解,不管是否发生了异常,都可自动关闭流
@Synchronized 等同于 synchronized 关键字
@SneakyThrows 使用此注解,可自动将异常包装成 RuntimeException 并抛出,无需手动写 try{}cache(){}

原理:

在编译阶段修改结构来转换抽象语法树(AST)。通过修改(或转换)AST,Lombok可以对源代码进行修剪,来避免胖长。这与纯文本代码生成不同。Lombok所生成的代码对于同一编译单元的类是可见的,不同于带库的直接字符编码操作。比如:CGLib 或者 ASM。

使用 javac 编译源码的具体流程如下:

  1. javac 对源代码进行分析,生成一颗抽象语法树(AST);
  2. 运行过程中调用实现了 JSR 269 API 的A程序;
  3. 此时A程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树(AST);
  4. javac 使用修改后的抽象语法树(AST)生成字节码文件;

什么是 AST 转换?

AST 转换 是在编译过程中用来修改抽象语法树结构的代码的名称。修改 AST,通过在将其转换为字节码之前增加附加节点,是更好的生成代码的方法。(这是相对于进行文本代码或直接生成字节码操作的常见技术而言。)直接采用 AST 还意味着开发人员需要访问编译器 API,这就引入了其他代码生成工具所不具备的,Lombok 的一个特性:自定义编译错误与警告功能。

问题:

  1. 违反所见即所得;
  2. 特定的Lombok转换将根本地改变 Java 语法;
  3. 注释命名约定不沟通意图。在Lombok中,注释不再仅是元数据,实质上是像命令一样驱动代码生成;

利用Project Lombok 自定义AST 转换:https://www.ibm.com/developerworks/cn/java/j-lombok/index.html