问题和背景
每次你在写Java Bean的时候是不是都得写上一堆的Get Set方法,如果属性较多的话,这个Java Bean就会变的很长,虽然IDE可以帮助我们生成这些东西,但是这种体验依然不爽。
我只是想写个Bean,一下子给我搞出来这么多代码,把我的关注点全都整没了,真是让人烦躁。
看看下面这团代码你觉得烦不烦
package test;
public class Test {
private String id;
private String name;
private String age;
private String gender;
private String address;
private String email;
private String qq;
private String phone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
利器出鞘,谁与争锋
苍天有眼, 终于有人看不下去了,下面有请我们的主角隆重登场。
图片
这个主角就是lombok
, 他的出现让我彻底欲罢不能,彻底放弃了以前的做法。
上边那个例子,只需要在类上加上一个@Data
注解即可达到同样的效果。
@Data
public class Test {
private String id;
private String name;
private String age;
private String gender;
private String address;
private String email;
private String qq;
private String phone;
}
代码量从76 行直接变成了11行,而且代码更加清晰明了,一目了然。
图片
探索Lombok更多功能
什么如果你觉得Lombok就只是帮助我们生成Get Set那你就too young too naive 了,我们一块来看看Lombok还是有哪些值得我们兴奋的特性吧。
你想要包含所有参数的构造方法? 没问题,安排
以前我们这么写
package test;
import lombok.Data;
@Data
public class Test {
private String id;
private String name;
private String age;
private String gender;
private String address;
private String email;
private String qq;
private String phone;
public Test(String id, String name, String age, String gender, String address, String email, String qq,
String phone) {
super();
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
this.address = address;
this.email = email;
this.qq = qq;
this.phone = phone;
}
}
你还需要一个无参数的构造方法? 没问题,安排上
以前我们这么写
package test;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class Test {
private String id;
private String name;
private String age;
private String gender;
private String address;
private String email;
private String qq;
private String phone;
}
再来一个,让你彻底爱上它
我们以前使用日志框架,一般是先在类上定义一个私有的logger对象,然后用Factory 调用静态的getLogger方法来给logger对象赋值
package test;
public class Logger {
//每次都得搞这么一句话,十分不爽
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Logger.class);
public static void main(String[] args) {
try {
int a = 1 / 0;
} catch (Exception e) {
log.error(e.getMessage());
}
}
}
有了lombok后我们可以跟他说拜拜了,一个注解@Slf4j 全搞定
package test;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Logger {
public static void main(String[] args) {
try {
int a = 1 / 0;
} catch (Exception e) {
//这个log 变量我们可以不声明就用哦
log.error(e.getMessage());
}
}
这里我只列举几个常用的注解,更多的功能需要你自己去官网探索哦。
Lombok引入工程
引入lombok的依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
<scope>provided</scope>
</dependency>
Lombok的scope=provided,说明它只在编译阶段生效,不需要打入包中。事实正是如此,Lombok在编译期将带Lombok注解的Java文件正确编译为完整的Class文件,所以lombok不会对程序性能带来任何的损失。那些说Lombok是通过反射获取xx信息,从而带来性能下降的说法简直是荒谬。
添加IDE对lombok的支持(IDEA为例)
点击File-- Settings设置界面,安装Lombok插件
点击File-- Settings设置界面,开启 AnnocationProcessors:
开启该项是为了让Lombok注解在编译阶段起到作用。
Lombok实现原理
自从Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”规范,只要程序实现了该API,就能在javac运行的时候得到调用。
Lombok就是一个实现了"JSR 269 API"的程序。在使用javac的过程中,它产生作用的具体流程如下:
- javac对源代码进行分析,生成一棵抽象语法树(AST)
- javac编译过程中调用实现了JSR 269的Lombok程序
- 此时Lombok就对第一步骤得到的AST进行处理,找到Lombok注解所在类对应的语法树 (AST),然后修改该语法树(AST),增加Lombok注解定义的相应树节点
- javac使用修改后的抽象语法树(AST)生成字节码文件