当前位置:网站首页>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:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!
边栏推荐
猜你喜欢
2022年化工自动化控制仪表考试试题及在线模拟考试
Explanation of message passing in DGL
Broyage · fusion | savoir que le site officiel de chuangyu mobile end est en ligne et commencer le voyage de sécurité numérique!
基于昇腾AI丨以萨技术推出视频图像全目标结构化解决方案,达到业界领先水平
Implement the rising edge in C #, and simulate the PLC environment to verify the difference between if statement using the rising edge and not using the rising edge
2022 t elevator repair operation certificate examination questions and answers
2022年危险化学品经营单位主要负责人特种作业证考试题库及答案
九、磁盘管理
【js学习笔记五十四】BFC方式
风控模型启用前的最后一道工序,80%的童鞋在这都踩坑
随机推荐
四部门:从即日起至10月底开展燃气安全“百日行动”
基于昇腾AI丨以萨技术推出视频图像全目标结构化解决方案,达到业界领先水平
BOM//
uniapp
Share Net lightweight ORM
Talk about the understanding of fault tolerance mechanism and state consistency in Flink framework
dsPIC33EP 时钟初始化程序
谈谈对Flink框架中容错机制及状态的一致性的理解
Bidirectional RNN and stacked bidirectional RNN
Operation of simulated examination platform of special operation certificate examination question bank for safety production management personnel of hazardous chemical production units in 2022
图片懒加载的方案
Explanation of full vulnerability script of network security C module of secondary vocational group script containing 4 vulnerabilities
【全网首发】(大表小技巧)有时候 2 小时的 SQL 操作,可能只要 1 分钟
微信核酸检测预约小程序系统毕业设计毕设(7)中期检查报告
Crawler (9) - scrape framework (1) | scrape asynchronous web crawler framework
32:第三章:开发通行证服务:15:浏览器存储介质,简介;(cookie,Session Storage,Local Storage)
When using gbase 8C database, an error is reported: 80000502, cluster:%s is busy. What's going on?
Operators
Go-3-第一个Go程序
Web3 Foundation grant program empowers developers to review four successful projects