当前位置: 首页 > 科技观察

Java坑攻略:Lombok同时使用@Data和@Builder的坑

时间:2023-03-12 12:47:21 科技观察

1。问题背景Lombok同时使用@Data和@Builder构建无参构造函数报错!编译失败。如下图所示:2.Lombok@Data和@Builder分别分析使用Lombok使用@Data生成getter/setter方法,用于无参构造和类中的所有属性。可以简化我们代码的开发。(需要安装Lombok插件和Lombok依赖)。例如下面的实体类,引入Lombok后,可以自动生成GET/SET方法和无参构造函数。编译后的类是:可以看到不仅为我们生成了get和set,还生成了一个无参数的默认构造函数。那么如何自动生成带参数的构造函数呢?使用@Builder注解可以帮助我们生成一个全属性的构造方法。编译后的类是:可以看到已经为我们构建了所有属性的构造方法,但是如果value只引用了@Builder注解,是无法生成get和set的。但是如果同时使用@Data和@Builder,可以看出虽然生成了GET/SET方法,但是无参构造方法没有了,这显然是不能接受的,因为很多框架都会调用无参构造来创建对象。编译类:我们尝试手动给Tet1类添加一个无参构造方法。编译发现报错失败:3.解决方法一当Lombok同时使用@Data和@Builder时,如果要生成无参结构体,需要在代码中手动引入注解@Tolerate让Lombokgenerate是一个类时,并不知道指定的构造函数。方法二(感谢评论区九四提供思路)直接使用无参构造函数+参数构造函数的方法,@RequiredArgsConstructor构建有参,@NoArgsConstructor构建无参构造函数,如图图:编译后效果:4.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的特性。作者:树东先生链接:https://juejin.cn/post/7103011031672176677来源:稀土掘金