🗝Lombok的工作原理

会发现在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码。自动生成的代码到底是如何产生的呢? 核心之处就是 ~对于注解的解析上~ 。JDK5引入了注解的同时,也提供了两种解析方式。

  1. Annotation Processing Tool(过期) apt自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有2点原因:
  1. ➡️ ::Pluggable Annotation Processing API:: JSR 269 自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:

  1. Lombok本质上就是一个实现了“ JSR 269 API ”的程序。在使用javac的过程中,它产生作用的具体流程如下:
  2. javac对源代码进行分析,生成了一棵抽象语法树(AST)
  3. 运行过程中调用实现了“JSR 269 API”的Lombok程序
  4. 此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点
  5. javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块) 拜读了Lombok源码,对应注解的实现都在HandleXXX中,比如@Getter注解的实现时HandleGetter.handle()。还有一些其它类库使用这种方式实现,比如 Google AutoDagger 等等。

Lombok介绍、使用方法和总结 - 夏雪冬日 - 博客园