学习笔记 : Lombok简介及基本使用
简介
问题引入 : 开发中经常需要写的JavaBean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误哟~
Lombok能通过注解的方式,在编译时自动为属性生成构造器
、getter/setter
、equals
、hashcode
、toString
方法. 出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法. 这样就省去了手动重建这些代码的麻烦,既而达到简化代码,提高开发人员的开发效率的目的
- 优点 :
- 能通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,提高了一定的开发效率
- 让代码变得简洁,不用过多的去关注相应的方法
- 属性做修改时,也简化了维护为这些属性所生成的getter/setter方法等
- 缺点 :
- 不支持多种参数构造器的重载
- 虽然省去了手动创建getter/setter方法的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度
- 总结 :
- Lombok虽然有很多优点,但Lombok更类似于一种IDE插件,项目也需要依赖相应的jar包. Lombok依赖jar包是因为编译时要用它的注解,为什么说它又类似插件 ? 因为在使用时Eclipse或IntelliJ IDEA都需要安装相应的插件,
在编译器编译时通过操作AST( 抽象语法树 )改变字节码生成,变向的就是说它在改变Java语法. 它不像Spring的依赖注入或者MyBatis的ORM一样是运行时的特性,而是编译时的特性
- Lombok虽然有很多优点,但Lombok更类似于一种IDE插件,项目也需要依赖相应的jar包. Lombok依赖jar包是因为编译时要用它的注解,为什么说它又类似插件 ? 因为在使用时Eclipse或IntelliJ IDEA都需要安装相应的插件,
开发环境
添加Maven依赖 :
1
2
3
4
5
6<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>安装IDEA(
IntelliJ Lombok plugin
)插件
常见异常
(已添加
lombok
依赖情况下)抛出此异常,(IDEA环境)解决方案:安装IntelliJ Lombok plugin
并启用Enable annotation processing
1
2
3
4
5
6
7Warning:(49, 8) java: lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation: java.lang.IllegalArgumentException: com.sun.tools.javac.main.DelegatingJavaFileManager$DelegatingSJFM extends com.sun.tools.javac.main.DelegatingJavaFileManager implements javax.tools.StandardJavaFileManager
at lombok.javac.apt.LombokFileObjects.getCompiler(LombokFileObjects.java:148)
at lombok.javac.apt.InterceptingJavaFileManager.<init>(InterceptingJavaFileManager.java:40)
at lombok.javac.apt.LombokProcessor.placePostCompileAndDontMakeForceRoundDummiesHook(LombokProcessor.java:165)
at lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:87)
at lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:87)
at lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:140)JDK版本bug,解决方案:重置JDK版本,Project Structure—>Porject settings—>Project : 将
Project SDK
设置为:9(java version"9.0.4")
,language level
设置为8
,详情操作请参考 : IDEA为何多处设置JDK,有什么区别呢 ?1
2
3Warning:(9, 8) java: lombok.javac.apt.LombokProcessor could not be initialized. Lombok will not run during this compilation: java.lang.IllegalArgumentException: com.sun.tools.javac.main.DelegatingJavaFileManager$DelegatingSJFM extends com.sun.tools.javac.main.DelegatingJavaFileManager implements javax.tools.StandardJavaFileManager
at lombok.javac.apt.LombokFileObjects.getCompiler(LombokFileObjects.java:148)
at lombok.javac.apt.InterceptingJavaFileManager.<init>(InterceptingJavaFileManager.java:40)
使用Lombok前后对比
一个未使用Lombok的普通JavaBean
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53package pers.huangyuhui.lombok.bean;
import org.apache.log4j.Logger;
public class User {
private Integer id;
private String name;
private String password;
private Logger log = Logger.getLogger(this.getClass());
public User() {
}
public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}一个使用Lombok的普通JavaBean( 使用Lombok注解达到与上述JavaBean同样的效果 )~
@Data
: 注解在类上,提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString方法@Setter
: 注解在属性上,为属性提供 setting 方法@Getter
: 注解在属性上,为属性提供 getting 方法@Log4j
: 注解在类上,为类提供一个属性名为 log 的 log4j 日志对象@ToString
: 注解在类上,为类提供一个 toString 方法@NoArgsConstructor
: 注解在类上,为类提供一个无参的构造方法@AllArgsConstructor
: 注解在类上,为类提供一个全参的构造方法
1 | package pers.huangyuhui.lombok.bean; |
参考链接 :
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment