服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!

日期: 来源:程序猿DD收集编辑:

来源: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的特性。


------
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取

推荐阅读

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

相关阅读

  • JDK 20 / Java 20 正式 GA

  • 出品 | OSC开源社区(ID:oschina2013)JDK 20 / Java 20 正式发布。JDK 20 是一个短期维护版本,将获得六个月的支持。尽管如此,但它仍然可用于生产环境中。根据开发计划,下一个 LTS
  • 受贿近7000万 杨懿文一审获刑16年半

  • 3月23日,湖南省株洲市中级人民法院依法对湖南省常德市委原书记杨懿文受贿、滥用职权一案公开宣判,杨懿文犯受贿罪,判处有期徒刑十五年,并处罚金人民币三百五十万元;犯滥用职权罪,
  • 石家庄最新回复!涉地铁规划、两所在建小学…

  • 近日记者整理了3月以来石家庄市政府网站、人民网留言板等网站的公开信息了解到官方对大家关心的各类问题已作出最新回复内容涉及地铁规划两所在建小学最新进展回迁房交付、
  • 开除!免职!警方介入→

  • 近日,有网友爆料一小学教师连扇女生数十耳光还用凳子殴打引发社会关注西安的刘女士称,2月23日,周至县仰天小学一名二年级老师检查全班同学的数学作业,有问题就打。“老师扇了孩
  • 一周工作动态(3月13日-3月19日)

  • 3月13日国土空间规划科▲杭州市规划和自然资源局组织召开城西科创大走廊核心区城市设计专题会议,市规划资源局党组书记、一级巡视员陈祥荣,市规划资源局一级调研员杨明聪,余杭

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 除了参赛服和奖牌,今年汉马跑友还有这些福利

  • 武汉晚报3月24日讯(记者张琳)3月24日,记者从在2023武汉体育消费周暨中国银行2023武汉马拉松新闻通气会上获悉,今年除了精美的参赛服和完赛奖牌外,汉马赛事福利将再次升级。赛事补
  • 网传文心一言的魔性作图,有点被吓到...

  • 来源:菜鸟教程近日看到网友们用百度文心一言来作图,看了后我都愣住了。。。1、AI 作画 -- 车水马龙2、AI 作画 -- 驴肉火烧3、AI 作画 -- 唐伯虎点秋香4、AI 作画 -- 鱼香肉
  • JDK 20 / Java 20 正式 GA

  • 出品 | OSC开源社区(ID:oschina2013)JDK 20 / Java 20 正式发布。JDK 20 是一个短期维护版本,将获得六个月的支持。尽管如此,但它仍然可用于生产环境中。根据开发计划,下一个 LTS