Lombok的简介
Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够在编译源代码期间自动帮我们生成这些方法,并没有如反射那样降低程序的性能。
环境准备
想要体验一把Lombok的话,得先在自己的开发环境中安装上对应的插件。
在IDEA中安装上Lombok插件
- 通过IDEA的plugins寻找Lombok
- 从IDEA的plugins安装Lombok
- 重启IDEA
在使用lombok注解的时候记得要导入lombok.jar包到工程
如果使用的是Maven的工程项目的话,要在其pom.xml中添加依赖如下:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.8</version>
</dependency>
接下来就可以在Java工程中开始用Lombok这款开发神器了。
Lombok常用注解说明
- @NonNull:用在方法参数前,会自动对该参数进行非空校验,为空抛出NPE( NullPointerException)
- @Cleanup:自动管理资源,用在局部变量之前,在当前变量范围内即将执行完毕退出前会清理资源,生成try- finally的代码关闭流
- @Getter/@Setter:用在属性上,不用自己手写 setter和 getter方法,还可指定访可范围
- @ToString:用在类上,可以自动覆写toString方法
- @EqualsAndHashCode:用在类上,自动生成 equals方法和 hashCode方法
- @NoArgsConstructor,@RequiredArgsConstructor and @AllArgsConstructor:用在类上,自动生成无参构造和使用所有参数的有参构造函数
- @Data:用在类上,相当于同时使用了@ToString、@EqualsAndHashCode、@Getter、@Setter和@RequiredArgsConstrutor这些注解,对POJO类十分有用
- @Value:用在类上,是@Data的不可变形式。相当于为属性添加final声明,只提供 getter方法,而不提供 setter方法
- @SneakyThrows:自动抛受检异常,而无需显式在方法上使用 throws语句
- @Synchronized:用在方法上,将方法声明为同步的,并自动加锁
- @Getter(lazy=true):可以替代经典的Double Check Lock样板代码
Lombok基本使用示例
@NonNull注解能够为方法或构造函数的参数提供非空检查
public void notNullExample(@NonNull String string) {
string.length();
}
//=>相当于
public void notNullExample(String string) {
if (string != null) {
string.length();
} else {
throw new NullPointerException("null");
}
}
@Cleanup注解能够自动释放资源
public void jedisExample(String[] args)
try {
@cleanup Jedis jedis = redisService. getJedis()
} catch (Exception ex) {
logger.error("Jedis异常:",ex)
}
//=>上面代码相当于如下
Jedis jedis = null
try {
jedis= redisService getjedis();
} catch (Exception e) {
logger.error("Jedis异常:",ex)
} finally {
if (jedis !=null) {
try{
jedis.close();
}catch (Exception e) {
e printStackTrace()
}
}
}
}
@Getter/@Setter注解可以针对类的属性字段自动生成Get/Set方法
public class OrderCreateDemoReq{
@Getter
@Setter
private String customerId;
@Setter
@Getter
private String poolId;
//其他代码……
}
//上面请求Req类的代码相当于如下:
public class OrderCreateDemoReq{
private String customerId;
private String poolId;
public String getCustomerId(){
return customerId;
}
public String getPoolId(){
return poolId;
}
public void setCustomerId(String customerId){
this.customerId = customerId;
}
public void setPoolId(String poolId){
this.pool = pool;
}
}
@Data注解作用比较全,其包含注解的集合@ToString,@EqualsAndHashCode,所有字段的@Getter和所有非final字段的@Setter, @RequiredArgsConstructor。其示例代码可以参考上面几个注解的组合
Lombok自定义注解原理
作为一个Java开发者来说光了解插件或者技术框架的用法只是做到了“知其然而不知其所以然”,如果真正掌握其背后的技术原理,看明白源码设计理念才能真正做到“知其然知其所以然”。
可能熟悉Java自定义注解的同学已经猜到,Lombok这款插件在javac编译阶段对自定义的注解进行预处理后生成真正在JVM上面执行的“Class文件”。Lombok插件具体的执行流程如下:
从上面的Lombok执行的流程图中可以看出,在Javac 解析成AST抽象语法树之后, Lombok 根据自己编写的注解处理器,动态地修改 AST,增加新的节点(即Lombok自定义注解所需要生成的代码),最终通过分析生成JVM可执行的字节码Class文件。使用Annotation Processing自定义注解是在编译阶段进行修改,而JDK的反射技术是在运行时动态修改,两者相比,反射虽然更加灵活一些但是带来的性能损耗更加大。
要更加深入理解Lombok插件的细节,自己查阅其源代码是必比可少的。
lombok的官方地址:https://projectlombok.org/