当前位置:网站首页>Lombok原理和同时使⽤@Data和@Builder 的坑
Lombok原理和同时使⽤@Data和@Builder 的坑
2022-07-06 04:10:00 【Hollis Chuang】
来源:https://juejin.cn/post/7103011031672176677
问题背景
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的特性。
完
往期推荐
金额计算用 BigDecimal 就万无一失了?看看这五个坑吧~~
有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看️
边栏推荐
- Yyds dry goods inventory hcie security Day11: preliminary study of firewall dual machine hot standby and vgmp concepts
- MySql数据库root账户无法远程登陆解决办法
- Esp32 (based on Arduino) connects the mqtt server of emqx to upload information and command control
- C (XXIX) C listbox CheckedListBox Imagelist
- asp. Core is compatible with both JWT authentication and cookies authentication
- Stack and queue
- C form application of C (27)
- 软考 系统架构设计师 简明教程 | 总目录
- Comprehensive ability evaluation system
- 1291_Xshell日志中增加时间戳的功能
猜你喜欢
Fundamentals of SQL database operation
Network security - Security Service Engineer - detailed summary of skill manual (it is recommended to learn and collect)
[Key shake elimination] development of key shake elimination module based on FPGA
Detailed explanation of serialization and deserialization
No qualifying bean of type ‘......‘ available
MySQL reads missing data from a table in a continuous period of time
图应用详解
1291_Xshell日志中增加时间戳的功能
10个 Istio 流量管理 最常用的例子,你知道几个?
After five years of testing in byte, I was ruthlessly dismissed in July, hoping to wake up my brother who was paddling
随机推荐
MySQL reads missing data from a table in a continuous period of time
Global and Chinese markets for endoscopic drying storage cabinets 2022-2028: Research Report on technology, participants, trends, market size and share
【按键消抖】基于FPGA的按键消抖模块开发
[introduction to Django] 11 web page associated MySQL single field table (add, modify, delete)
Error 1045 (28000): access denied for user 'root' @ 'localhost' (using password: no/yes
Brief tutorial for soft exam system architecture designer | general catalog
Scalpel like analysis of JVM -- this article takes you to peek into the secrets of JVM
Yyds dry goods inventory hcie security Day11: preliminary study of firewall dual machine hot standby and vgmp concepts
Chinese brand hybrid technology: there is no best technical route, only better products
Cf603e pastoral oddities [CDQ divide and conquer, revocable and search set]
【PSO】基于PSO粒子群优化的物料点货物运输成本最低值计算matlab仿真,包括运输费用、代理人转换费用、运输方式转化费用和时间惩罚费用
Global and Chinese markets for medical gas manifolds 2022-2028: Research Report on technology, participants, trends, market size and share
Basic use of MySQL (it is recommended to read and recite the content)
What is the difference between gateway address and IP address in tcp/ip protocol?
asp. Core is compatible with both JWT authentication and cookies authentication
Global and Chinese market of rubber wheel wedges 2022-2028: Research Report on technology, participants, trends, market size and share
About some basic DP -- those things about coins (the basic introduction of DP)
综合能力测评系统
IDEA编译JSP页面生成的class文件路径
ESP32_ FreeRTOS_ Arduino_ 1_ Create task