本文运用的环境版别:
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万现金大奖」