问题背景
lombok @data和@builder分别单独分析用法
解决方法
方法一
方法二
lombok原理
总结
问题背景
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的特性。
wigig技术开发无线vr的工作原理
Nexperia针对汽车以太网推具有开创性且符合OPEN Alliance 标准的硅基ESD器件
全球半导体设备五强酝酿大变局
电源芯片制造商Intersil拟裁员18%,波及数百人
单向可控硅调压电路
Lombok同时使用@Data和@Builder的一个必须要避开的巨坑
利用工业互联网引领传统工厂走向智能化
半导体行业在经济发展中扮演的角色
受蜘蛛网启发的量子纳米机械谐振器
狐狸狡猾更显猎人真功,广东省总队查获一起无人机高空飞线走私案
继往年iphone各类“事件门”之后,iPhone 8/8 Plus再现“噪音门”
Molex基于100G PAM-4光学平台的特点及应用解决方案
加码高校AI人才培养,已成为主流趋势
浅谈数字音视频在未来的六大应用
自比亚马逊 Uber的自动驾驶来势汹汹
给大家讲一种不常见的制动控制系统
VisIC 公司宣布其电动汽车充电器(OBC)计划投入市场,重量仅为4.5千克
三种方法教你如何破解51单片机
触想触控一体机在商业智能智慧点餐中的应用分享
采用有源RFID的仓库管理系统设计方案