一、背景
咱先小看一下下面这幅对比图,两边都是简单的 javabean,相较于右边常规地写了一大堆 get 和 set 方法,左边的 javabean 中并没有看到任何 get 和 set 方法却能照常调用却无异常,why?
二、Lombok 简介
官方地址:https://projectlombok.org/
github地址:https://github.com/rzwitserloot/lombok
Lombok是一个很灵巧的工具,只要使用相对应的注解,它变可以帮助我们简化消除一些必须有但是明显很臃肿的 Java 代码,比如 javabean 中很冗长的 get 和 set 方法。
如下图中,我们仅仅添加了一个 @Data 注解,查看左边的构造,发现已经帮我们自动添加了构造、 get、set、equals、toString 等方法。
三、Lombok使用
首先一点,我们需要在我们的 idea 中安装相应的插件,比如使用 Intellij IDEA,只需要去插件库里面搜索 Lombok Plugin 即可。
其次,项目中需要导入 jar 包,若使用 maven 构建项目,则只需在 pom 中添加如下代码:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> </dependency>
接下来就可以大展身手了,上面提到,我们只需要进行简单的注解即可,那么下面就来介绍下各种常用注解吧(标红的为最常用的):
val : 最终局部变量
@NonNull : 让你不在担忧并且爱上NullPointerException
@CleanUp : 自动资源管理:不用再在finally中添加资源的close方法
@Setter/@Getter : 自动生成set和get方法
@ToString : 自动生成toString方法
@EqualsAndHashcode : 从对象的字段中生成hashCode和equals的实现
@NoArgsConstructor/@RequiredArgsConstructor/@AllArgsConstructor 自动生成构造方法
@Data : 自动生成set/get方法,toString方法,equals方法,hashCode方法,不带参数的构造方法
@Value : 用于注解final类
@Builder : 产生复杂的构建器api类
@SneakyThrows : 异常处理(谨慎使用)
@Synchronized : 同步方法安全的转化
@Getter(lazy=true) :
@Log : 支持各种logger对象,使用时用对应的注解,如:@Log4j
附上官方文档(注解说明)地址:https://projectlombok.org/features/index.html
四、原理说明
其实我们都很好奇,为什么只需要加入一些简单的注解,变会自动实现这么多强大的功能。
自从 Java 6 起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该 API ,就能在 javac 运行的时候得到调用。
举例来说,现在有一个实现了" JSR 269 API "的程序A,那么使用javac编译源码的时候具体流程如下:
1) javac 对源代码进行分析,生成一棵抽象语法树 (AST)
2) 运行过程中调用实现了" JSR 269 API "的A程序
3) 此时 A 程序就可以完成它自己的逻辑,包括修改第一步骤得到的抽象语法树 (AST)
4) javac 使用修改后的抽象语法树 (AST) 生成字节码文件
详细的流程图如下:
lombok 本质上就是这样的一个实现了"JSR 269 API"的程序。在使用 javac 的过程中,它产生作用的具体流程如下:
1) javac 对源代码进行分析,生成一棵抽象语法树(AST)
2) 运行过程中调用实现了"JSR 269 API"的 lombok 程序
3) 此时 lombok 就对第一步骤得到的 AST 进行处理,找到 @Data 注解所在类对应的语法树(AST),然后修改该语法树(AST),增加 getter 和 setter 方法定义的相应树节点
4) javac 使用修改后的抽象语法树(AST)生成字节码文件
五、罪恶之源
诚然,lombok 给我们带来了莫大的便捷,但是同时也是对源代码文件的可读性和完整性的大打折扣,并且降低了对源代码阅读的舒适性。
文章评论