Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!

1、Lombok 使用演示

Lombok 使⽤同时使⽤ @Data 和 @Builder ,构建无参构造器报错!编译不通过。如下图:

在这里插入图片描述

Lombok 使⽤ @Data 可以自动⽣成⽆参构造和类⾥⾯所有属性的 getter/setter ⽅法。可以简化我们代码的开发。(IDEA 需要安装 Lombok 插件和引⼊ Lombok 依赖)。

例如下⾯的⼀个实体类,引⼊ Lombok 后,可以⾃动⽣成 GET/SET ⽅法⽆参构造函数。

在这里插入图片描述

编译后的 class 为:可以看到不仅帮我们生成了 get 和 set ,同时也有默认的无参构造器

在这里插入图片描述

那么怎么自动生成有参构造器呢?使用 @Builder 注解,将会帮助我们⽣成全属性的构造⽅法。

在这里插入图片描述

编译后的 class 为:可以看到 已经帮我们构建好了全属性的构造方法,但是如果值只引用 @Builder 注解是无法生成 get和set 的。

在这里插入图片描述

但是如果同时使⽤ @Data 和 @Builder 的话,可以看出尽管⽣成了 GET/SET ⽅法,但是⽆参构造⽅法没有了,这显然是不能接受的,因为很多框架都会调⽤⽆参构造去创建对象。

在这里插入图片描述

编译后的 class:

在这里插入图片描述

我们尝试在Tet1类,⼿动添加⽆参构造⽅法。编译发现报错不通过:

在这里插入图片描述

Lombok 同时使⽤ @Data 和 @Builder 的时候,如果要⽣成⽆参构造,需要在代码⾥⾯⼿动引⼊注解 @Tolerate,让 Lombok 在⽣成类的时候,对指定的构造函数不感知。

在这里插入图片描述

直接使用无参构造器+有参构造器的方式,@RequiredArgsConstructor 来构建有参,@NoArgsConstructor来构建无参构造器,如图所示:

在这里插入图片描述

编译后效果:

在这里插入图片描述

2、Lombok 原理

Java 的编译分为以下⼏个阶段:

解析与填充符号表->注解处理->分析与字节码⽣成->⽣成⼆进制class⽂件。

Lombok 使⽤的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器),它是在编译期时把 Lombok 的注解代码,转换为常规的 Java ⽅法⽽实现注⼊。

在编译期阶段,当 Java 源码被抽象成语法树 (AST) 之后,Lombok 会根据⾃⼰的注解处理器动态的修改 AST,增加新的代码 (节点),在这⼀切执⾏之后,再通过分析⽣成了最终的字节码 (.class) ⽂件,这就是 Lombok 的执⾏原理。
可以借助注解处理器实现⼀个简单的 Setter,我们的实现步骤是:

⾃定义⼀个注解标签接⼝,并实现⼀个⾃定义的注解处理器;
利⽤ tools.jarjavac api 处理 AST (抽象语法树)3. 使⽤⾃定义的注解处理器编译代码。

1.定义⾃定义注解和注解处理器

⾸先创建⼀个 MySetter.java ⾃定义⼀个注解,代码如下:

在这里插入图片描述

再实现⼀个⾃定义的注解处理器,代码如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

测试类如下:

在这里插入图片描述

2.对注解处理器进⾏编译,随后使⽤注解处理器对类进⾏编译

⾸先需要先对注解处理器进⾏编译(javac -cp ⽤于引⼊第三⽅jar包进⾏编译)

在这里插入图片描述

然后使⽤注解处理器对这个Person测试类进⾏编译:

这时候再看⽣成的Person.class,可以发现Setter⽅法已经⽣成了:

在这里插入图片描述

在这里插入图片描述

3、总结

当然尽管测试类已经⽣成Setter⽅法,但是因为是在编译时期⽣成的,因此我们在开发的时候是没法直接调⽤Setter⽅法的,因此Lombok提供了插件机制,⽅便我们在开发的时候可以直接去调⽤Lombok的特性。

猜你喜欢

转载自blog.csdn.net/qq_35971258/article/details/132391298