当前位置:网站首页>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的特性。
边栏推荐
- Redis tool class redisutil (tool class III)
- [unique] what is the [chain storage structure]?
- Zabbix 5.0:通过LLD方式自动化监控阿里云RDS
- Introduction to RC oscillator and crystal oscillator
- Word wrap when flex exceeds width
- ROS学习(21)机器人SLAM功能包——orbslam的安装与测试
- #夏日挑战赛#数据库学霸笔记(下)~
- ROS学习(二十)机器人SLAM功能包——rgbdslam的安装与测试
- CISP-PTE实操练习讲解(二)
- The use of video in the wiper component causes full screen dislocation
猜你喜欢
Blackfly s usb3 industrial camera: buffer processing
老板被隔离了
ROS learning (25) rviz plugin
【论文阅读|深读】ANRL: Attributed Network Representation Learning via Deep Neural Networks
【论文阅读|深读】DNGR:Deep Neural Networks for Learning Graph Representations
ROS學習(23)action通信機制
ROS学习(26)动态参数配置
Time synchronization of livox lidar hardware -- PPS method
微服务架构介绍
大咖云集|NextArch基金会云开发Meetup来啦!
随机推荐
【论文阅读|深读】RolNE: Improving the Quality of Network Embedding with Structural Role Proximity
传感器:土壤湿度传感器(XH-M214)介绍及stm32驱动代码
Zhang Ping'an: accelerate cloud digital innovation and jointly build an industrial smart ecosystem
强化学习如何用于医学影像?埃默里大学最新《强化学习医学影像分析》综述,阐述最新RL医学影像分析概念、应用、挑战与未来方向
FLIR blackfly s industrial camera: configure multiple cameras for synchronous shooting
Flir Blackfly S USB3 工业相机:计数器和定时器的使用方法
PartyDAO如何在1年内把一篇推文变成了2亿美金的产品DAO
ROS learning (26) dynamic parameter configuration
长安链学习笔记-证书研究之证书模式
Input and output of C language pointer to two-dimensional array
Processing image files uploaded by streamlit Library
Metaforce force meta universe development and construction - fossage 2.0 system development
BigDecimal 的正确使用方式
Tiflash source code reading (IV) design and implementation analysis of tiflash DDL module
ROS学习(十九)机器人SLAM功能包——cartographer
使用Ceres进行slam必须要弄清楚的几个类和函数
FLIR blackfly s industrial camera: explanation and configuration of color correction and code setting method
ROS学习(23)action通信机制
ROS learning (21) robot slam function package -- installation and testing of orbslam
张平安:加快云上数字创新,共建产业智慧生态