Lombok简介
Project Lombok makes java a spicier language by adding ‘handlers’ that know >how to build and compile simple, boilerplate-free, not-quite-java code.
如Github上项目介绍所言,Lombok项目通过添加“处理程序”,使java成为一种更为简单的语言。作为一个Old Java Developer,我们都知道我们经常需要定义一系列的套路,比如定义如下的格式对象。
|
|
我们往往需要定义一系列的Get和Set方法最终展示形式如:
|
|
那我们有没有可以简化的办法呢,第一种就是使用IDEA等IDE提供的一键生成的快捷键,第二种就是我们今天介绍的 Lombok项目:
|
|
Wow…这样就可以完成我们的需求,简直是太棒了,仅仅需要几个注解,我们就拥有了完整的GetSet方法,还包含了ToString等方法的生成。
Lombok安装
整个Lombok只有一个Jar包,可到这里下载:https://projectlombok.org/download
Lombok支持多种使用安装方式,这里我们讲最常见的对两大IDE的支持:
Eclipse (含延伸版本)
双击打开 lombok.jar (前提:你得装了JDK), 可见如下页面点击 Install/Update:
恭喜你,已经安装成功了。我们打开 Eclipse 的 About 页面我们可以看见。
IntelliJ IDEA
- 定位到 File > Settings > Plugins
- 点击 Browse repositories…
- 搜索 Lombok Plugin
- 点击 Install plugin
- 重启 IDEA
更多安装请参考:https://projectlombok.org/
Lombok使用
Lombok 其实也不能算是一个特别新的项目,从 2011 开始在中心仓库提供支持,现在也分为 stable 和 experimental 两个版本,本文侧重介绍 stable 功能:
val
如果对其他的语言有研究的会发现,很多语言是使用 var 作为变量申明,val作为常量申明。这里的val也是这个作用。
|
|
翻译成 Java 程序是:
|
|
作者注:也就是类型推导啦。
@NonNull
Null 即是罪恶
|
|
翻译成 Java 程序是:
|
|
@Cleanup
自动化才是生产力
|
|
翻译成 Java 程序是:
|
|
作者注: JKD7里面就已经提供 try with resource
@Getter/@Setter
再也不写 public int getFoo() {return foo;}
|
|
翻译成 Java 程序是:
|
|
@ToString
Debug Log 最强帮手
|
|
翻译后:
|
|
作者注:其实和 org.apache.commons.lang3.builder.ReflectionToStringBuilder 很像。
@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor
|
|
翻译后:
|
|
@Data
这个就相当的简单啦,因为我们发现@ToString
, @EqualsAndHashCode
, @Getter
都很常用,这个一个注解就相当于
|
|
@Value
|
|
翻译后:
|
|
我们发现了 @Value 就是 @Data 的不可变版本。至于不可变有什么好处。可有参看此篇(https://blogs.msdn.microsoft.com/ericlippert/2007/11/13/immutability-in-c-part-one-kinds-of-immutability/)
@Builder
我的最爱
|
|
builder是现在比较推崇的一种构建值对象的方式。
作者注:生成器模式
@SneakyThrows
to RuntimeException 小助手
|
|
翻译后
|
|
很好的隐藏了异常,有时候的确会有这样的烦恼,从某种程度上也是遵循的了 let is crash
@Synchronized
|
|
翻译后
|
|
这个就比较简单直接添加了synchronized关键字就Ok啦。不过现在JDK也比较推荐的是 Lock 对象,这个可能用的不是特别多。
@Getter(lazy=true)
节约是美德
|
|
翻译后:
|
|
@Log
再也不用写那些差不多的LOG啦
|
|
|
|
|
|
翻译后:
|
|
|
|
|
|
Lombok原理
说道 Lombok,我们就得去提到 JSR 269: Pluggable Annotation Processing API (https://www.jcp.org/en/jsr/detail?id=269) 。JSR 269 之前我们也有注解这样的神器,可是我们比如想要做什么必须使用反射,反射的方法局限性较大。首先,它必须定义@Retention为RetentionPolicy.RUNTIME,只能在运行时通过反射来获取注解值,使得运行时代码效率降低。其次,如果想在编译阶段利用注解来进行一些检查,对用户的某些不合理代码给出错误报告,反射的使用方法就无能为力了。而 JSR 269 之后我们可以在 Javac的编译期利用注解做这些事情。所以我们发现核心的区分是在 运行期 还是 编译期。
从上图可知,Annotation Processing 是在解析和生成之间的一个步骤。
上图是 Lombok 处理流程,在Javac 解析成抽象语法树之后(AST), Lombok 根据自己的注解处理器,动态的修改 AST,增加新的节点(所谓代码),最终通过分析和生成字节码。
关于原理我们大致上的描述下,如果有兴趣可以参考下方文档。