lombok原理

前两天有个小朋友问我,lombok插件本地必须安装才可以用,那线上是怎么运行的?虽然知道lombok注解是在编译器生效,但还是一知半解,所以决定查下相关资料总结一下。

首先我们使用lombok是通过注解的方式来实现的,但是在idea并未安装插件的时候,使用自动生成的方法编译器是会报错的。这是因为lombok是使用编译时注解实现的。IDEA 的 lombok 插件不会处理你的代码,只是告诉静态代码分析工具,这个某些方法已经被注解处理程序实现了,检查时不要报错。

Java中的注解分为两类

  • 运行时注解(程序运行时通过反射得到我们注解的信息)
  • 编译时注解(程序在编译期间通过注解处理器进行处理)

而lombok需要插件的原因是因为编译器编译时通过操作AST(抽象语法树)改变字节码生成。(JAVA的语法树可以理解为java文件的dom模型)

原理

  • 定义编译期的注解
  • 利用JSR269 api(Pluggable Annotation Processing API )创建编译期的注解处理器
  • 利用tools.jar的javac api处理AST(抽象语法树)
  • 将功能注册进jar包

什么是AST语法树

AST(Abstract syntax tree)即为“抽象语法树”,简称语法树,指代码在计算机内存的一种树状数据结构,便于计算机理解和阅读。

通过idea中的插件JDT AstView可以看到Java中的抽象语法树。

包括package信息,imports信息,字段信息和方法信息。

微信截图_20200705192822
这里是Java的编译流程,可以看到在字节码生成之前会先生成抽象语法树。
20131113150025609

如何修改AST?

  • 创建继承AbstractProcessor这个类的注解处理器
  • 利用tools.jar的javac api处理AST(抽象语法树)

具体如何写这里就不介绍了,感兴趣的读者可以查一下相关API。

注:参考链接[3]中简单粗暴的写了一个使用编译时注解实现了将setter方法改造为builder模式的例子。

参考