前言

Lombok 是一个很方便的插件,本质是个 Java 库,使用它通过相关注解就可以不用再编写冗长的 getter 或者 equals 等方法了。

Lombok 实现原理

java注解

从JDK5开始,Java增加对元数据(描述数据属性的信息)的支持,也就是注解,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过注解开发人员可以在不改变原有代码和逻辑的情况下在源代码中嵌入补充信息。

注解解析方式

JDK5引入了注解的同时,也提供了两种解析方式。

  • 运行时解析
  • 编译时解析

运行时解析

运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。java.lang,reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等.

编译时解析

编译时解析有两种机制:

  • Annotation Processing Tool
  • Pluggable Annotation Processing API:插入式注解处理器

APT自JDK5产生,JDK7已标记为过期,不推荐使用,JDK8中已彻底删除。新的解析机制为JSR 269规范(可插拔批注处理API)。

在JAVA 1.6后,JDK提供了一种方式,可以让我们修改编译过程,在编译期融入我们自己编译逻辑,也就是插入式注解处理器,它提供了一组编译器的插入式注解处理器的标准API在编译期间对注解进行处理。解决了APT没有集成到javac中,只能在运行时通过反射来获取注解值,运行时代码效率降低等问题。

javac的编译过程,大致可以分为3个过程,分别是:

  1. 解析与填充符号表过程: 读取命令行上指定的所有源文件,将其解析为语法树,然后将所有外部可见的定义输入到编译器的符号表中。
  2. 插入式注解处理器的注解处理过程:调用所有适当的注解处理器。如果任何注解处理器生成任何新的源文件或类文件,则将重新启动编译,直到没有新文件创建为止。
  3. 分析与字节码生成过程:最后,分析器创建的语法树将被分析并转换为类文件。在分析过程中,可能会找到对其他类的引用。编译器将检查这些类的源和类路径。如果在源路径上找到它们,则这些文件也将被编译,尽管它们将不受注解处理。

java中lombok delegate用法 java lombok原理_spring

Lombok 实现原理

在Javac 解析成抽象语法树之后(AST), Lombok 根据自己的注解处理器,动态的修改 AST,增加新的节点(所谓代码),最终通过分析和生成字节码。

java中lombok delegate用法 java lombok原理_语法树_02