Lombok 同时使用 @Data 和 @Builder 的巨坑,千万别乱用!
程序员的成长之路
共 2980字,需浏览 6分钟
·
2024-08-16 07:38
阅读本文大概需要 4 分钟。
来自:juejin.cn/post/7103011031672176677
问题背景
@Data
和@Builder
,构建无参构造器报错!编译不通过。如下图:
Lombok @Data和@Builder分别单独分析用法
@Data
可以⽣成⽆参构造和类⾥⾯所有属性的getter/setter
⽅法。可以简化我们代码的开发。(需要安装Lombok插件和引⼊Lombok依赖)。
GET/SET
⽅法和⽆参构造函数。
@Builder
注解,将会帮助我们⽣成全属性的构造⽅法。
@Builder
注解是无法生成get和set的。
@Data
和@Builder
的话,可以看出尽管⽣成了GET/SET⽅法,但是⽆参构造⽅法没有了,这显然是不能接受的,因为很多框架都会调⽤⽆参构造去创建对象。
解决方法
方法一
@Data
和@Builder
的时候,如果要⽣成⽆参构造,需要在代码⾥⾯⼿动引⼊注解@Tolerate
,让Lombok在⽣成类的时候,对指定的构造函数不感知。
方法二(感谢评论区 九又四分之三 提供思路)
@RequiredArgsConstructor
来构建有参,@NoArgsConstructor
来构建无参构造器,如图所示:
Lombok原理
-
Lombok 使⽤的是 JDK 6 实现的 JSR 269: Pluggable Annotation Processing API
(编译期的注解处理器),它是在编译期时把 Lombok 的注解代码,转换为常规的 Java ⽅法⽽实现注⼊。 -
在编译期阶段,当 Java 源码被抽象成语法树 (AST) 之后,Lombok 会根据⾃⼰的注解处理器动态的修改AST,增加新的代码 (节点),在这⼀切执⾏之后,再通过分析⽣成了最终的字节码 (.class) ⽂件,这就是Lombok 的执⾏原理。
-
⾃定义⼀个注解标签接⼝,并实现⼀个⾃定义的注解处理器; -
利⽤ tools.jar
的javac api
处理 AST (抽象语法树)3. 使⽤⾃定义的注解处理器编译代码。
1.定义⾃定义注解和注解处理器
2.对注解处理器进⾏编译,随后使⽤注解处理器对类进⾏编译
javac -cp
⽤于引⼊第三⽅jar包进⾏编译)
Person.class
,可以发现Setter⽅法已经⽣成了:
总结
推荐阅读:
程序员在线工具站:cxytools.com 推荐一个自己写的工具站:http://cxytools.com,专为程序员设计,包括时间日期、JSON处理、SQL格式化、随机字符串生成、UUID生成、文本Hash...等功能,提升开发效率。
⬇戳阅读原文直达! 朕已阅
评论