走进lombok世界
Welcome to lombok world....
什么是lombok?
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.
Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
lombok项目是一个Java库,它会自动插入您的编辑器和构建工具中,从而为您的Java增光添彩。永远不要再去生成getter或equals方法,只需在你的类上添加一个注解,你的类则变成了一个功能全面的生成器,包括自动产生日志记录变量等等。
简而言之,lombok就是简化Java开发者编写代码用的一个Java类库。
如何使用lombok?
1、maven工程项目直接在pom文件中添加lombok依赖即可.
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.10</version> </dependency> |
2、IDEA插件安装(笔者自用,Eclipse请自行Google)
不安装插件,项目编译会报错。这个也是一个不好的地方吧,毕竟要求参与项目的每个成员都要安装lombok插件-_-
File -> Settings -> Plugins -> (搜索)lombok (如下图,这里我已经安装过了,装好重启即可) 网络原因,就不截图了。。。-_-
|
3、相关常用注解
@Getter/@Setter: 自动生成get/set方法
Source Code @Getter @Setter public class Person { private Integer id; private String userName; } Byte Code public class Person { private Integer id; private String userName;
public Person() { }
public Integer getId() { return this.id; }
public String getUserName() { return this.userName; }
public void setId(Integer id) { this.id = id; }
public void setUserName(String userName) { this.userName = userName; } } |
@Builder: 用在类上,将类变成builder API风格,即Fluent Interface风格
Source Code @Builder public class CustomException<T> { private int code; private String msg; private T data; } Byte Code public class CustomException<T> { private int code; private String msg; private T data;
CustomException(int code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; }
public static <T> CustomException.CustomExceptionBuilder<T> builder() { return new CustomException.CustomExceptionBuilder(); }
public static class CustomExceptionBuilder<T> { private int code; private String msg; private T data;
CustomExceptionBuilder() { }
public CustomException.CustomExceptionBuilder<T> code(int code) { this.code = code; return this; }
public CustomException.CustomExceptionBuilder<T> msg(String msg) { this.msg = msg; return this; }
public CustomException.CustomExceptionBuilder<T> data(T data) { this.data = data; return this; }
public CustomException<T> build() { return new CustomException(this.code, this.msg, this.data); }
public String toString() { return "CustomException.CustomExceptionBuilder(code=" + this.code + ", msg=" + this.msg + ", data=" + this.data + ")"; } } } |
@Data:功能相当于(@Getter/@Setter/@RequiredArgsConstructor/@ToString
/@EqualsAndHashCode)注解的组合
@RequiredArgsConstructor/NoArgsConstructor 自动生成空参数构造
@AllArgsConstructor 自动生成全参数构造
@ToString 自动生成toString方法
@EqualsAndHashCode 自动重写equals和hashCode方法
@Value 相当于@Data,不提供@Setter方法。为每个字段添加final关键字
探索lombok底层实现
要了解lombok如何实现,首先我们要稍微了解下JSR规范和编译器原理。
1、JSR规范是什么?( https://zh.wikipedia.org/wiki/JCP)
JSR全称Java Specification Requests(Java规范请求);被JCP(Java Community Process)作为正式规范文档。JCP是一个 开放性国际组织,主要有Java开发者以及被授权者组成(主要是为了Java语言的发展和更新);而lombok则遵循JSR 269 规范【Pluggable Annotations Processing API】(https://www.jcp.org/en/jsr/detail?id=269)
2、为什么要了解编译原理?
上文提到,lombok是一款运行在编译期的Java 类库。所以当执行javac进行编译的时候,则lombok也会同时运行。
在编译原理一书中提到,编译期大致流程分为:
扫描源文件 -> 词法分析 -> Token -> 语法分析 -> AST(抽象语法树) -> 语义分析 -> 生成字节码文件
Lombok则是一款运行在编译期的类库,通过修改AST,增加新的节点,从而生成对应的字节码文件.
总结
总的来说,lombok就是为了简化开发者开发的,至于用不用,仁者见仁,智者见智吧。毕竟它要依赖插件,恐怖的传播性。但是也有认为这并不算什么,一句话:看项目吧。