[日积月累]Lombok注解学习笔记
站长
· 阅读数 25
本文使用的环境版本:
Java 1.8
Project Lombok >= 1.18.24
Lombok是什么?
Project Lombok(Lombok)是一个基于注解的Java库,允许你减少模板代码。
Lombok提供了各种注解,旨在取代那些众所周知的模板化、重复性或繁琐的Java代码。
例如,通过使用Lombok,你只需添加一些注解,就可以避免编写没有参数的构造函数、toString()、equals()和hashCode()方法等等。
Lombok的工作原理探究
从1.6开始,java推出了JSR 269 Pluggable Annotation Processing API 规范
Lombok继承并实现了这些API,对注解进行处理
在javac运行的时候,如果java文件中包含了Lombok注解,Lombok就会在编译class文件时做出对应的操作
在编译时,javac编译源文件时会调用Lombok的Api,对编译文件进行修改,并生成新的class文件
具体实现情况如下:
- 在编译过程中,javac对.java源码分析生成AST抽象语法树(对于ASTjava语法树的内容,后续我会更新一篇文章来专门做讲解)
- 如果.java文件中包含Lombok注解,根据JSR 269 API,会调用lombok实现的方法
- 例如:如果我们java文件中包含@Getter注解,Lombok注解处理器就会找到@Getter注解所在java类对应的AST抽象语法树,然后修改该语法树(AST),增加getterr方法定义的相应树节点
如下图所示,添加@Getter注解后,编译的class文件包含了参数的get方法,但是在源java文件中是不包含这些方法的。
如何为项目引入Lombok?
Gradle
compileOnly 'org.projectlombok:lombok:1.18.24'
annotationProcessor 'org.projectlombok:lombok:1.18.24'
Maven
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
<scope>provided</scope>
</dependency>
maven编译器插件添加lombok依赖:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>11</source>
<target>11</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.24</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<!-- ... -->
</plugins>
</build>
Lombok 常用注解大全
代码示例
@Log
@Log4j
@Log4j2
@Slf4j
@XSlf4j
@JBossLog
@CommonsLog
@Flogger
public class LombokDemo {
public static void main(String[] args) {
Demo01 demo01 = new Demo01();
demo01.setId("369");
demo01.setNum(1);
demo01.setFlag(true);
log.info(demo01.toString());
}
//参数相关
@Getter
@Setter
@EqualsAndHashCode(of = {"id","name"})
@ToString(of = {"id","flag"})
//构造函数
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
@Data
// @Value
@Builder
// @Singular("xxx")
private static class Demo01 {
private String id;
private Integer num;
private Boolean flag;
}
@SneakyThrows
private void throwMethod(){
int i = 1/0 ;
}
@Synchronized
private void sych(){
int i = 1/0 ;
}
@SneakyThrows
private void cleanup(){
@Cleanup FileInputStream inputStream = new FileInputStream("xxx");
}
private void var(){
var zero = 1L;
var s = "str";
var list = new ArrayList<>();
var map = new HashMap<>();
}
}
关于是否要使用Lombok的讨论
优点:
-
开发便捷,不需要手动生产一些getset方法
-
修改字段方便,不需要维护字段衍生的一些方法
缺点:
- 病毒式传播,一旦项目中有人使用了lombok,那么其他人势必也要引入此插件
- 代码可读性差,通过注解的方式生产class代码,这就导致我们无法直观的看到一些方法实现的细节
- 代码可调试性降低,由于lombok是编译时插件,所以在运行的时候,我们在编译器里就很难定位到具体的方法,只能去class文件去查看具体错误位置
- 踩坑,欲负王冠,必承其重。在实际项目工作中,多多少少总会遇到使用lombok踩坑的问题,这种时候兜兜转转一大圈才发现问题出在lombok上,那酸爽,别提多得劲了~
总结
本文中,通过对lombok原理探究,以及一些常用注解的总结,来学习了一下lombok,如果你对本篇文章感兴趣,请在评论区留言,一起学习
本文正在参加「金石计划 . 瓜分6万现金大奖」