0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Lombok同时使用@Data和@Builder的一个必须要避开的巨坑

jf_ro2CN3Fa 来源:树洞君 作者:树洞君 2022-10-11 18:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

问题背景

Lombok @Data和@Builder分别单独分析用法

解决方法

方法一

方法二

Lombok原理

总结

问题背景

Lombok使⽤ 同时使⽤@Data和@Builder ,构建无参构造器报错!编译不通过。如下图:

30fcccac-47b9-11ed-a3b6-dac502259ad0.jpg

Lombok @Data和@Builder分别单独分析用法

Lombok使⽤@Data可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter⽅法。可以简化我们代码的开发。(需要安装Lombok插件和引⼊Lombok依赖)。

例如下⾯的⼀个实体类,引⼊Lombok后,可以⾃动⽣成GET/SET⽅法和⽆参构造函数。

310e6890-47b9-11ed-a3b6-dac502259ad0.jpg编译后的class为:可以看到不仅帮我们生成了get和set ,同时也有默认的无参构造器

3125c396-47b9-11ed-a3b6-dac502259ad0.jpg

那么怎么自动生成有参构造器呢?使用@Builder注解,将会帮助我们⽣成全属性的构造⽅法。

314a71aa-47b9-11ed-a3b6-dac502259ad0.jpg

编译后的class为:可以看到 已经帮我们构建好了全属性的构造方法,但是如果值只引用@Builder注解是无法生成get和set的。

316222aa-47b9-11ed-a3b6-dac502259ad0.jpg

但是如果同时使⽤@Data和@Builder的话,可以看出尽管⽣成了GET/SET⽅法,但是⽆参构造⽅法没有了,这显然是不能接受的,因为很多框架都会调⽤⽆参构造去创建对象。

3170a69a-47b9-11ed-a3b6-dac502259ad0.jpg

编译后的class:318e9f38-47b9-11ed-a3b6-dac502259ad0.jpg

我们尝试在Tet1类,⼿动添加⽆参构造⽅法。编译发现报错不通过:

30fcccac-47b9-11ed-a3b6-dac502259ad0.jpg

解决方法

方法一

Lombok同时使⽤@Data和@Builder的时候,如果要⽣成⽆参构造,需要在代码⾥⾯⼿动引⼊注解@Tolerate,让Lombok在⽣成类的时候,对指定的构造函数不感知。

31d635f0-47b9-11ed-a3b6-dac502259ad0.jpg

方法二

直接使用无参构造器+有参构造器的方式,@RequiredArgsConstructor 来构建有参,@NoArgsConstructor来构建无参构造器,如图所示:

31e61114-47b9-11ed-a3b6-dac502259ad0.jpg编译后效果:

320202a2-47b9-11ed-a3b6-dac502259ad0.jpg

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 ⾃定义⼀个注解,代码如下:

322d8bca-47b9-11ed-a3b6-dac502259ad0.jpg

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

323c9552-47b9-11ed-a3b6-dac502259ad0.jpg32574b7c-47b9-11ed-a3b6-dac502259ad0.jpg3295f1ce-47b9-11ed-a3b6-dac502259ad0.jpg

测试类如下:

32b791d0-47b9-11ed-a3b6-dac502259ad0.jpg

2.对注解处理器进⾏编译,随后使⽤注解处理器对类进⾏编译

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

32cef5fa-47b9-11ed-a3b6-dac502259ad0.jpg

然后使⽤注解处理器对这个Person测试类进⾏编译:

这时候再看⽣成的Person.class,可以发现Setter⽅法已经⽣成了:

32e5ffca-47b9-11ed-a3b6-dac502259ad0.jpg32f6a2f8-47b9-11ed-a3b6-dac502259ad0.jpg

总结

当然尽管测试类已经⽣成Setter⽅法,但是因为是在编译时期⽣成的,因此我们在开发的时候是没法直接调⽤Setter⽅法的,因此Lombok提供了插件机制,⽅便我们在开发的时候可以直接去调⽤Lombok的特性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    20

    文章

    2997

    浏览量

    115685
  • Data
    +关注

    关注

    0

    文章

    63

    浏览量

    39043
  • 编译
    +关注

    关注

    0

    文章

    688

    浏览量

    34950
  • 插件
    +关注

    关注

    0

    文章

    345

    浏览量

    23418
  • Builder
    +关注

    关注

    1

    文章

    23

    浏览量

    11577

原文标题:Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何避开智能硬件创业的那些

    `智能硬件是继智能手机之后的科技概念,通过软硬件结合的方式,对传统设备进行改造,进而让其拥有智能化的功能。智能化之后,硬件具备连接的能力,实现互联网服务的加载,形成“云+端”的典型架构,具备了
    发表于 03-14 10:13

    请问uboot必须要吗?

    uboot是必须要的吗?
    发表于 08-23 05:45

    对于28335的SPI的FIFO接收,必须要发送与接收同时开启吗?

    对于28335的SPI的FIFO接收,必须要发送与接收同时开启吗,因为我只想接收数据,28335不需要发送数据。(外部的芯片数据放在外部芯片的寄存器中,28335通过SPI读取即可)在TI给出
    发表于 07-20 06:22

    数据包解密必须要配置哪些

    1、数据包解密必须要配置 Netkey,Appkey,Devkey, IV Index的,可以找下配置接口。2、广播包需要 37,38, 39 三通道同时抓才行,般使用的是专门的仪
    发表于 07-22 08:04

    stm32hal库之外部中断

    stm32hal库之外部中断,如果使用按键外部中断会导致频繁触发中断,从而不能退出中断,导致卡死void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin
    发表于 08-13 08:17

    智能音箱想要成功 必须要先弄清楚这3问题

    2018年6月14日,在亿欧“智能+新商业峰会”同期举办的“AI消费产品峰会”上,我们将专门设立智能音箱相关圆桌论坛,对这问题进行深刻的探讨。而今天,就先来聊聊智能音箱想要成功,必须要想清楚的3问题。
    发表于 12-18 16:59 2520次阅读
    智能音箱想要成功 <b class='flag-5'>必须要</b>先弄清楚这3<b class='flag-5'>个</b>问题

    单片机程序为什么必须要包含CONST H

    下面就介绍下在我的单片机程序里必须要包含的头文件----“const.h”,完整内容如下:
    发表于 08-15 17:32 2次下载
    单片机程序为什么<b class='flag-5'>必须要</b>包含CONST H

    三极管,三必须要掌握的“判别方法”资料下载

    电子发烧友网为你提供三极管,三必须要掌握的“判别方法”资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
    发表于 04-03 08:42 17次下载
    三极管,三<b class='flag-5'>个</b><b class='flag-5'>必须要</b>掌握的“判别方法”资料下载

    Lombok开发插件使用小技巧

    0x01:Lombok简介 Lombok款 Java开发插件,使得 Java 开发者可以通过其定义的些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的 Java 模型对象(
    的头像 发表于 06-12 18:07 2218次阅读

    重演自己如何掉入Lombok的戏法陷阱

    。您是否正准备拥抱Lombok?还是正准备将如此酷炫的项目推荐给你的团队?如果您准备那么做,不妨听听我在使用Lombok年后的些感受。 我承认,
    的头像 发表于 10-28 11:29 1458次阅读

    发现Spring事务的bug 你必须要小心了

    不正确 9.多线程调用 10.嵌套事务多回滚了 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了。在某些业务场景下,如果同时有多张表的写入操作,为了保证操作的原子性(要么同时成功,要么同时失败)避免数据不
    的头像 发表于 10-11 18:17 1151次阅读

    Lombok的使用

    在平时我们工作的时候,我们经常会使用 toString() 方法来输出对象的些属性信息。Lombok 给我们提供了
    的头像 发表于 09-25 14:03 1452次阅读

    Lombok如何派上用场

    Java的 record 关键字是Java 14中引入的新的语义特性。record 对于创建小型不可变的对象非常有用。另方面,Lombok
    的头像 发表于 10-08 15:39 655次阅读

    小程序开发“”多,华为云这款轻量应用服务器轻松避

    地分享和传播。小程序开发如今已经成为了很多企业和个人的选择,它具有快速、简洁、低成本等优势,但同时也存在许多隐藏的陷阱。 七大,埋雷众多 第一大坑:设计不合理 不合理的设计会给用户
    的头像 发表于 11-23 00:53 543次阅读
    小程序开发“<b class='flag-5'>巨</b><b class='flag-5'>坑</b>”多,华为云这款轻量应用服务器轻松避<b class='flag-5'>坑</b>

    选择身份核验终端硬件设备,你需要避开那些

    假如你是安防软硬件方案集成商,需要采购批身份核验终端硬件设备进行集成开发,功能包括人脸识别、扫码识别和刷卡识别,最好能支持国产系统,在选择硬件合作商时需要注意什么,又需要避开哪些
    的头像 发表于 09-02 10:23 485次阅读
    选择身份核验终端硬件设备,你需要<b class='flag-5'>避开</b>那些<b class='flag-5'>坑</b>?