有人中意简洁的代码,有人诟病Lombok的侵入性,而我因为接手的项目不得不用
1. 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 —— Project Lombok
Lombok项目是一个Java库,可自动插入你的编辑器以及构建工具,为你的Java增添趣味。再也不用写额外的getter或equals方法,通过一个注解,你的类就有一个功能齐全的构造器,自动记录变量,等等。
感受使用Lombok的快捷与简便,下面二者功能相同
代码语言:javascript复制// 常规代码
public class User {
private String username;
private String password;
private String email;
// 省略各种getter、setter
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
// 重写toString方法
@Override
public String toString() {
return "User{"
"username='" username '''
", password='" password '''
", email='" email '''
'}';
}
// 重写equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(username, user.username) &&
Objects.equals(password, user.password) &&
Objects.equals(email, user.email);
}
@Override
public int hashCode() {
return Objects.hash(username, password, email);
}
}
代码语言:javascript复制// 使用了Lombok
@Data
public class User {
private String username;
private String password;
private String email;
}
这个注解包括了 Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode(后面会解释)
2. 操作原理
Lombok使用到注解,那么我们就从注解开始入手,注解的解析分为:
- 运行时解析:@Retention设置为RUNTIME,利用反射拿到注解
- 编译时解析
Annotation Processing Tool:注解处理工具,已经废弃了- Pluggable Annotation Processing API:拔插式注解处理接口,集成到了javac中
我们知道,javac让我们写的代码 .java编译成 .class,配合 拔插式注解处理接口
其编译过程如下:
- javac分析源代码,生成抽象语法树(AST)
- javac运行中调用实现
拔插式注解处理接口
的Lombok项目(lombok.jar) - Lombok修改@Data注解所在类对应的语法树(AST),增添getter、setter等方法相应的树节点
- javac使用修改后的抽象语法树(AST)生成字节码文件
一句话就是:Lombok修改了抽象语法树(AST),导致javac生成增强功能的字节码,也就是新的类
3. 安装和使用
3.1 安装
Lombok集成到 javac中作为一个注解处理器来启动。在IDEA中用插件的形式来支持Lombok,所以要使用则要先安装插件,然后再启动注解处理器
3.2 依赖
使用的话当然要加依赖了,以maven项目为例:
代码语言:javascript复制<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
3.3 使用
怎样使用?直接在类上,变量,方法上加注解,常见的注解如下:
注解 | 解释 |
---|---|
@Gette、@Setter | 生成getter、setter方法 |
@ToString | 重写toString方法 |
@EqualsAndHashCode | 重写hashCode、equals方法 |
@NoArgsConstructor | 无参构造 |
@AllArgsConstructor | 全参构造 |
@RequiredArgsConstructor | 按照要求生成构造器(final、@NotNull修饰的变量) |
@Data | Getter、Setter、RequiredArgsConstructor、ToString、EqualsAndHashCode |
@Builder | 生成的对象可链式调用set |
@Slf4j(还有其它的log注解) | 不用再new一个log对象,可直接调用 log.info("日志") |
@NonNull | 非空检查,否则抛出空指针异常 |
@Cleanup | 修饰的变量会自动关闭资源,调用close方法 |
4. 缺点
- 强迫使用:代码中使用了Lombok,那么别人也得安装Lombok才能正常编译
- JDK版本问题:既然使用了lombok.jar依赖,难免会有版本问题
- 代码调试性降低:编译时期才增添方法,若想知道这些方法在哪里被引用则较麻烦