Java鬼使神迹——Lombok

一、背景

咱先小看一下下面这幅对比图,两边都是简单的 javabean,相较于右边常规地写了一大堆 get 和 set 方法,左边的 javabean 中并没有看到任何 get 和 set 方法却能照常调用却无异常,why?

1490953451110645.png


二、Lombok 简介

官方地址:https://projectlombok.org/

github地址:https://github.com/rzwitserloot/lombok

Lombok是一个很灵巧的工具,只要使用相对应的注解,它变可以帮助我们简化消除一些必须有但是明显很臃肿的 Java 代码,比如 javabean 中很冗长的 get 和 set 方法。 

如下图中,我们仅仅添加了一个 @Data 注解,查看左边的构造,发现已经帮我们自动添加了构造、 get、set、equals、toString 等方法。

lombok_structure.png

三、Lombok使用

首先一点,我们需要在我们的 idea 中安装相应的插件,比如使用 Intellij IDEA,只需要去插件库里面搜索 Lombok Plugin 即可。

其次,项目中需要导入 jar 包,若使用 maven 构建项目,则只需在 pom 中添加如下代码:

```


  org.projectlombok
  lombok
  1.16.10
```

接下来就可以大展身手了,上面提到,我们只需要进行简单的注解即可,那么下面就来介绍下各种常用注解吧(标红的为最常用的):

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) 生成字节码文件 
详细的流程图如下: 

 抽象语法树(AST).jpg

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 给我们带来了莫大的便捷,但是同时也是对源代码文件的可读性和完整性的大打折扣,并且降低了对源代码阅读的舒适性。




------ 本文结束 感谢阅读 ------
0%