项目搭建[4]lombok的使用

Lombok简介

Lombok可以通过添加注解简化代码。Lombok主要采用 JSR 269 技术,在编译时增加相应的字节码信息。

注解处理技术简介

运行时解析

运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。

java.lang.reflect反射包中提供了一个接口AnnotatedElement,该接口定义了获取注解信息的几个方法,Class、Constructor、Field、Method、Package等都实现了该接口。

编译时解析

Annotation Processing Tool(apt)

apt自JDK1.5产生,JDK1.7已标记为过期,不推荐使用,JDK8中已彻底删除,自JDK1.6开始,可以使用Pluggable Annotation Processing API来替换它,apt被替换主要有两点原因:

  • api 都在com.sun.mirror非标准包下

  • 没有继承到javac中,需要额外运行

Pluggable Annotation Processing API(JSR 269)

JSR 269自JDK6加入,作为apt的替代方案,它解决了apt的两个问题,javac在执行的时候会调用实现了该API的程序,这样就可以对编译器做一些增强,此时javac执行过程如下:

1
2
3
.java文件 ---> Parse and Enter ---> Annotation Processing ---> Analyse and Generate ---> .class文件
^ |
|________________________________________________+

Lombok使用 JSR 269

Lombok本质上就是一个实现了”JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体过程如下:

  1. javac对源代码进行分析,生成了一棵抽象语法树(AST)

  2. 运行过程中调用实现了”JSR 269 API”的Lombok程序

  3. 此时Lombok就对第一步得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点

  4. javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)

Lombok常用注解

@Data

@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。

1
2
@Data
public class Test{}

@Setter/@Getter

注解在属性上,为单个属性提供set/get方法;注解在类上,为该类所有的属性提供set/get方法,都提供默认构造方法。

可以增加value属性,通过AccessLevel限制该方法的作用域。

@Log4j

注解在类上;为类提供一个 属性名为 log 的 log4j 日志对象,提供默认构造方法。

@NoArgsConstructor/@AllArgsConstructor

@NoArgsConstructor: 注解在类上;为类提供一个无参的构造方法。

@AllArgsConstructor: 注解在类上;为类提供一个全参的构造方法,加了这个注解后,类中不提供默认构造方法了。

@EqualsAndHashCode

注解在类上, 可以生成 equals、canEqual、hashCode 方法。

@ToString

这个注解用在类上,可以生成所有参数的 toString 方法,还会生成默认的构造方法。

@Cleanup

这个注解用在变量前面,可以保证此变量代表的资源会被自动关闭,默认是调用资源的 close() 方法,如果该资源有其它关闭方法,可使用 @Cleanup(“methodName”) 来指定要调用的方法,也会生成默认的构造方法

@NonNull

注解在属性上,会自动产生一个关于此参数的非空检查,如果参数为空,则抛出一个空指针异常,也会有一个默认的无参构造方法。

@Log4j/@Slf4j

根据使用框架的不同,选用不同的注解。Lombok会自动为方法提供logger对象的创建语句。