当前位置:网站首页>Lombok同时使⽤@Data和@Builder 的坑
Lombok同时使⽤@Data和@Builder 的坑
2022-07-06 18:39:00 【51CTO】
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的特性。
边栏推荐
- Date processing tool class dateutils (tool class 1)
- Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
- ROS learning (25) rviz plugin
- Flir Blackfly S 工业相机 介绍
- Redis configuration class redisconfig
- 红外相机:巨哥红外MAG32产品介绍
- Livox激光雷达硬件时间同步---PPS方法
- 云原生混部最后一道防线:节点水位线设计
- Centros 8 installation MySQL Error: The gpg Keys listed for the "MySQL 8.0 Community Server" repository are already ins
- Flir Blackfly S USB3 工业相机:计数器和定时器的使用方法
猜你喜欢

Ros Learning (23) Action Communication Mechanism

大咖云集|NextArch基金会云开发Meetup来啦!

【论文阅读|深读】RolNE: Improving the Quality of Network Embedding with Structural Role Proximity

Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem

SchedulX V1.4.0及SaaS版发布,免费体验降本增效高级功能!

开发中对集合里面的数据根据属性进行合并数量时犯的错误

处理streamlit库上传的图片文件

MySQL execution process and sequence

【论文阅读|深读】DNGR:Deep Neural Networks for Learning Graph Representations

一片葉子兩三萬?植物消費爆火背後的“陽謀”
随机推荐
Big guys gather | nextarch foundation cloud development meetup is coming!
ROS学习(24)plugin插件
Tiflash source code reading (IV) design and implementation analysis of tiflash DDL module
Sensor: DS1302 clock chip and driver code
The use of video in the wiper component causes full screen dislocation
Several classes and functions that must be clarified when using Ceres to slam
Sensor: introduction of soil moisture sensor (xh-m214) and STM32 drive code
Flir Blackfly S 工业相机 介绍
Dall-E Mini的Mega版本模型发布,已开放下载
Redis tool class redisutil (tool class III)
XML to map tool class xmlmaputils (tool class V)
新一代云原生消息队列(一)
建議收藏!!Flutter狀態管理插件哪家强?請看島上碼農的排行榜!
红外相机:巨哥红外MAG32产品介绍
leetcode:736. Lisp 语法解析【花里胡哨 + 栈 + 状态enumaotu + slots】
Ros Learning (23) Action Communication Mechanism
Chang'an chain learning notes - certificate model of certificate research
机器人队伍学习方法,实现8.8倍的人力回报
Jacob Steinhardt, assistant professor of UC Berkeley, predicts AI benchmark performance: AI has made faster progress in fields such as mathematics than expected, but the progress of robustness benchma
Vingt - trois mille feuilles? "Yang mou" derrière l'explosion de la consommation végétale