当前位置: 首页 > 后端技术 > Java

Lombok同时使用@Data和@Builder的坑,不要乱用!

时间:2023-04-01 18:19:23 Java

来源:juejin.cn/post/7103011031672176677问题背景Lombok同时使用@Data和@Builder,构建不带参数的构造函数会报错!最终编译失败。如下图所示:Lombok@Data和@Builder分别分析使用Lombok使用@Data生成getter/setter方法,用于无参构造和类中的所有属性。可以简化我们代码的开发。(需要安装Lombok插件和Lombok依赖)。例如下面的实体类,引入Lombok后,可以自动生成GET/SET方法和无参构造函数。编译后的类是:可以看到不仅为我们生成了get和set,还生成了一个无参数的默认构造函数。那么如何自动生成带参数的构造函数呢?使用@Builder注解可以帮助我们生成一个全属性的构造方法。编译后的类可以看到已经为我们构建了所有属性的构造方法,但是如果value只引用了@Builder注解,是无法生成get和set的。但是如果同时使用@Data和@Builder,可以看出虽然生成了GET/SET方法,但是无参构造方法没有了,这显然是不能接受的,因为很多框架都会调用无参构造来创建对象。编译类:我们尝试手动给Tet1类添加一个无参构造方法。编译发现报错失败:最新的Java开发工具教程:https://www.javastack.cn/devtools/解决方法1当Lombok同时使用@Data和@Builder时,如果想生成一个无参数的structure,需要在代码中手动引入注解@Tolerate,这样Lombok在生成类的时候就不会感知到指定的构造函数。方法二直接使用无参构造函数+有参构造函数的方法,@RequiredArgsConstructor构建有参,@NoArgsConstructor构建无参构造函数,如图:编译效果:Lombok原理Java编译分为以下几种三个阶段:解析和填充符号表->注释处理->分析和字节码生成->生成二进制类文件。Lombok使用JDK6实现的JSR269:PluggableAnnotationProcessingAPI(编译时注解处理器),在编译时将Lombok的注解代码转换为常规的Java方法,实现注入。在编译阶段,当Java源代码被抽象成语法树(AST)时,Lombok会根据自己的注解处理器动态修改AST,添加新的代码(节点)。分析生成最终的字节码(.class)文件,这就是Lombok的工作方式。可以在注解处理器的帮助下实现一个简单的Setter。我们的实现步骤是:自定义注解标签接口,实现自定义注解处理器;使用tools.jar的javacapi来处理AST(抽象语法树)3.使用自定义注释处理器编译代码。定义自定义注解和注解处理器首先创建一个MySetter.java来自定义一个注解,代码如下:然后实现一个自定义注解处理器,代码如下:测试类如下:编译注解处理器,然后使用注释处理器来编译类。首先需要编译注解处理器(javac-cp用于导入第三方jar包进行编译),然后使用注解处理器对Person进行测试。编译类:此时查看生成的Person.class,可以发现已经生成了Setter方法:总结当然,测试类虽然已经生成了Setter方法,但是是在编译的时候生成的,所以我们在开发的时候是不可能直接调用Setter方法的,所以Lombok提供了一种插件机制,让我们在开发的时候可以直接调用Lombok的特性。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!