Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)
問題背景
Lombok使? 同時(shí)使?@Data和@Builder ,構(gòu)建無參構(gòu)造器報(bào)錯(cuò)!編譯不通過。如下圖:

Lombok @Data和@Builder分別單獨(dú)分析用法
Lombok使?@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法??梢院喕覀兇a的開發(fā)。(需要安裝Lombok插件和引?Lombok依賴)。
例如下?的?個(gè)實(shí)體類,引?Lombok后,可以?動(dòng)?成GET/SET?法和?參構(gòu)造函數(shù)。

編譯后的class為:可以看到不僅幫我們生成了get和set ,同時(shí)也有默認(rèn)的無參構(gòu)造器

那么怎么自動(dòng)生成有參構(gòu)造器呢?使用@Builder注解,將會(huì)幫助我們?成全屬性的構(gòu)造?法。

編譯后的class為:可以看到 已經(jīng)幫我們構(gòu)建好了全屬性的構(gòu)造方法,但是如果值只引用@Builder注解是無法生成get和set的。

但是如果同時(shí)使?@Data和@Builder的話,可以看出盡管?成了GET/SET?法,但是?參構(gòu)造?法沒有了,這顯然是不能接受的,因?yàn)楹芏嗫蚣芏紩?huì)調(diào)??參構(gòu)造去創(chuàng)建對(duì)象。

編譯后的class:

我們嘗試在Tet1類,?動(dòng)添加?參構(gòu)造?法。編譯發(fā)現(xiàn)報(bào)錯(cuò)不通過:

解決方法
Lombok同時(shí)使?@Data和@Builder的時(shí)候,如果要?成?參構(gòu)造,需要在代碼???動(dòng)引?注解@Tolerate,讓Lombok在?成類的時(shí)候,對(duì)指定的構(gòu)造函數(shù)不感知。

Lombok原理
Java的編譯分為以下?個(gè)階段:
解析與填充符號(hào)表->注解處理->分析與字節(jié)碼?成->?成?進(jìn)制class?件。
Lombok 使?的是 JDK 6 實(shí)現(xiàn)的 JSR 269: Pluggable Annotation Processing API (編譯期的注解處理器),它是在編譯期時(shí)把 Lombok 的注解代碼,轉(zhuǎn)換為常規(guī)的 Java ?法?實(shí)現(xiàn)注?。
在編譯期階段,當(dāng) Java 源碼被抽象成語法樹 (AST) 之后,Lombok 會(huì)根據(jù)??的注解處理器動(dòng)態(tài)的修改AST,增加新的代碼 (節(jié)點(diǎn)),在這?切執(zhí)?之后,再通過分析?成了最終的字節(jié)碼 (.class) ?件,這就是Lombok 的執(zhí)?原理。
可以借助注解處理器實(shí)現(xiàn)?個(gè)簡單的 Setter,我們的實(shí)現(xiàn)步驟是:
- ?定義?個(gè)注解標(biāo)簽接?,并實(shí)現(xiàn)?個(gè)?定義的注解處理器;
- 利? tools.jar 的 javac api 處理 AST (抽象語法樹)3. 使??定義的注解處理器編譯代碼。
1.定義?定義注解和注解處理器
?先創(chuàng)建?個(gè) MySetter.java ?定義?個(gè)注解,代碼如下:

再實(shí)現(xiàn)?個(gè)?定義的注解處理器,代碼如下:



測試類如下:

2.對(duì)注解處理器進(jìn)?編譯,隨后使?注解處理器對(duì)類進(jìn)?編譯
?先需要先對(duì)注解處理器進(jìn)?編譯(javac -cp ?于引?第三?jar包進(jìn)?編譯)

然后使?注解處理器對(duì)這個(gè)Person測試類進(jìn)?編譯:
這時(shí)候再看?成的Person.class,可以發(fā)現(xiàn)Setter?法已經(jīng)?成了:


總結(jié)
當(dāng)然盡管測試類已經(jīng)?成Setter?法,但是因?yàn)槭窃诰幾g時(shí)期?成的,因此我們?cè)陂_發(fā)的時(shí)候是沒法直接調(diào)?Setter?法的,因此Lombok提供了插件機(jī)制,?便我們?cè)陂_發(fā)的時(shí)候可以直接去調(diào)?Lombok的特性。
到此這篇關(guān)于Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)的文章就介紹到這了,更多相關(guān)Lombok @Data和@Builder內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JAVA核心知識(shí)之ConcurrentHashMap源碼分析
這篇文章主要介紹了JAVA核心知識(shí)之ConcurrentHashMap源碼分析,想了解ConcurrentHashMap的同學(xué)一定要看啊2021-04-04
SpringBoot整合MD5加密完成注冊(cè)和登錄方式
MD5(MessageDigestAlgorithm5)是一種常見的哈希算法,用于生成固定長度(128位)的哈希值,主要應(yīng)用于數(shù)據(jù)完整性校驗(yàn)和密碼存儲(chǔ),MD5具有快速計(jì)算、不可逆性和抗碰撞性等特點(diǎn),盡管存在碰撞漏洞,MD5仍廣泛應(yīng)用于文件下載校驗(yàn)和數(shù)字簽名等場景2024-10-10
實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用
本篇文章主要通過實(shí)例對(duì)適配器模式進(jìn)行了詳解,需要的朋友可以參考下2017-04-04
SpringSecurity構(gòu)建基于JWT的登錄認(rèn)證實(shí)現(xiàn)
這篇文章主要介紹了SpringSecurity構(gòu)建基于JWT的登錄認(rèn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02
JavaCV實(shí)現(xiàn)讀取視頻信息及自動(dòng)截取封面圖詳解
javacv可以幫助我們?cè)趈ava中很方便的使用OpenCV以及FFmpeg相關(guān)的功能接口。本文將利用Javacv實(shí)現(xiàn)在視頻網(wǎng)站中常見的讀取視頻信息和自動(dòng)獲取封面圖的功能,感興趣的可以了解一下2022-06-06
SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦
這篇文章主要介紹了SpringBoot使用ApplicationEvent&Listener完成業(yè)務(wù)解耦示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
mybatis使用foreach遍歷list集合或者array數(shù)組方式
這篇文章主要介紹了mybatis使用foreach遍歷list集合或者array數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

