当前位置:网站首页>Lombok 同时使⽤@Data和@Builder 的坑,你中招没?
Lombok 同时使⽤@Data和@Builder 的坑,你中招没?
2022-07-05 10:42:00 【Java笔记虾】
点击关注公众号,利用碎片时间学习
问题背景
Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过。如下图:

Lombok @Data和@Builder分别单独分析用法
Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法。可以简化我们代码的开发。(需要安装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来构建无参构造器,如图所示:

编译后效果:

Lombok原理
Java的编译分为以下⼏个阶段:
解析与填充符号表->注解处理->分析与字节码⽣成->⽣成⼆进制class⽂件。
Lombok 使⽤的是 JDK 6 实现的
JSR 269: Pluggable Annotation Processing API(编译期的注解处理器),它是在编译期时把 Lombok 的注解代码,转换为常规的 Java ⽅法⽽实现注⼊。在编译期阶段,当 Java 源码被抽象成语法树 (AST) 之后,Lombok 会根据⾃⼰的注解处理器动态的修改AST,增加新的代码 (节点),在这⼀切执⾏之后,再通过分析⽣成了最终的字节码 (.class) ⽂件,这就是Lombok 的执⾏原理。
可以借助注解处理器实现⼀个简单的 Setter,我们的实现步骤是:
⾃定义⼀个注解标签接⼝,并实现⼀个⾃定义的注解处理器;
利⽤ tools.jar 的 javac api 处理 AST (抽象语法树)3. 使⽤⾃定义的注解处理器编译代码。
1.定义⾃定义注解和注解处理器
⾸先创建⼀个 MySetter.java ⾃定义⼀个注解,代码如下:

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



测试类如下:

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

然后使⽤注解处理器对这个Person测试类进⾏编译:
这时候再看⽣成的Person.class,可以发现Setter⽅法已经⽣成了:


总结
当然尽管测试类已经⽣成Setter⽅法,但是因为是在编译时期⽣成的,因此我们在开发的时候是没法直接调⽤Setter⽅法的,因此Lombok提供了插件机制,⽅便我们在开发的时候可以直接去调⽤Lombok的特性。
来源:juejin.cn/post/7103011031672176677
推荐:
最全的java面试题库
PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!边栏推荐
- 关于vray5.2怎么关闭日志窗口
- Advanced scaffold development
- Crawler (9) - scrape framework (1) | scrape asynchronous web crawler framework
- 风控模型启用前的最后一道工序,80%的童鞋在这都踩坑
- 埋点111
- 使用GBase 8c数据库过程中报错:80000502,Cluster:%s is busy,是怎么回事?
- 数据库中的范式:第一范式,第二范式,第三范式
- 【全网首发】(大表小技巧)有时候 2 小时的 SQL 操作,可能只要 1 分钟
- What are the top ten securities companies? Is it safe to open an account online?
- Lazy loading scheme of pictures
猜你喜欢

Wechat nucleic acid detection appointment applet system graduation design completion (6) opening defense ppt

华为设备配置信道切换业务不中断

基于昇腾AI丨爱笔智能推出银行网点数字化解决方案,实现从总部到网点的信息数字化全覆盖

LSTM applied to MNIST dataset classification (compared with CNN)

磨礪·聚變|知道創宇移動端官網煥新上線,開啟數字安全之旅!

Go language-1-development environment configuration

Web3 Foundation grant program empowers developers to review four successful projects

Explanation of message passing in DGL

修复动漫1K变8K

How to close the log window in vray5.2
随机推荐
Array
中职组网络安全2021年江苏省省赛题目5套题目环境+解析全有需要的私信我
How can gbase 8C database view the login information of the login user, such as the date, time and IP of the last login authentication?
基于昇腾AI丨爱笔智能推出银行网点数字化解决方案,实现从总部到网点的信息数字化全覆盖
TSQL–标示列、GUID 、序列
Go-2-Vim IDE常用功能
websocket
Question bank and answers of special operation certificate examination for main principals of hazardous chemical business units in 2022
Honing · fusion | know that the official website of Chuangyu mobile terminal is newly launched, and start the journey of digital security!
九、磁盘管理
Operation of simulated examination platform of special operation certificate examination question bank for safety production management personnel of hazardous chemical production units in 2022
LDAP overview
流程控制、
Based on shengteng AI Aibi intelligence, we launched a digital solution for bank outlets to achieve full digital coverage of information from headquarters to outlets
分享.NET 轻量级的ORM
Node の MongoDB Driver
GBase 8c数据库如何查看登录用户的登录信息,如上一次登录认证通过的日期、时间和IP等信息?
一次edu证书站的挖掘
uniapp
Scaffold development foundation