Lombok同時使?@Data和@Builder踩坑總結(jié)
問題背景
Lombok使? 同時使?@Data和@Builder ,構(gòu)建無參構(gòu)造器報錯!編譯不通過。如下圖:
Lombok @Data和@Builder分別單獨(dú)分析用法
Lombok使?@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法??梢院喕覀兇a的開發(fā)。(需要安裝Lombok插件和引?Lombok依賴)。
例如下?的?個實(shí)體類,引?Lombok后,可以?動?成GET/SET?法和?參構(gòu)造函數(shù)。
編譯后的class為:可以看到不僅幫我們生成了get和set ,同時也有默認(rèn)的無參構(gòu)造器
那么怎么自動生成有參構(gòu)造器呢?使用@Builder注解,將會幫助我們?成全屬性的構(gòu)造?法。
編譯后的class為:可以看到 已經(jīng)幫我們構(gòu)建好了全屬性的構(gòu)造方法,但是如果值只引用@Builder注解是無法生成get和set的。
但是如果同時使?@Data和@Builder的話,可以看出盡管?成了GET/SET?法,但是?參構(gòu)造?法沒有了,這顯然是不能接受的,因為很多框架都會調(diào)??參構(gòu)造去創(chuàng)建對象。
編譯后的class:
我們嘗試在Tet1類,?動添加?參構(gòu)造?法。編譯發(fā)現(xiàn)報錯不通過:
解決方法
Lombok同時使?@Data和@Builder的時候,如果要?成?參構(gòu)造,需要在代碼???動引?注解@Tolerate,讓Lombok在?成類的時候,對指定的構(gòu)造函數(shù)不感知。
Lombok原理
Java的編譯分為以下?個階段:
解析與填充符號表->注解處理->分析與字節(jié)碼?成->?成?進(jìn)制class?件。
Lombok 使?的是 JDK 6 實(shí)現(xiàn)的 JSR 269: Pluggable Annotation Processing API (編譯期的注解處理器),它是在編譯期時把 Lombok 的注解代碼,轉(zhuǎn)換為常規(guī)的 Java ?法?實(shí)現(xiàn)注?。
在編譯期階段,當(dāng) Java 源碼被抽象成語法樹 (AST) 之后,Lombok 會根據(jù)??的注解處理器動態(tài)的修改AST,增加新的代碼 (節(jié)點(diǎn)),在這?切執(zhí)?之后,再通過分析?成了最終的字節(jié)碼 (.class) ?件,這就是Lombok 的執(zhí)?原理。
可以借助注解處理器實(shí)現(xiàn)?個簡單的 Setter,我們的實(shí)現(xiàn)步驟是:
- ?定義?個注解標(biāo)簽接?,并實(shí)現(xiàn)?個?定義的注解處理器;
- 利? tools.jar 的 javac api 處理 AST (抽象語法樹)3. 使??定義的注解處理器編譯代碼。
1.定義?定義注解和注解處理器
?先創(chuàng)建?個 MySetter.java ?定義?個注解,代碼如下:
再實(shí)現(xiàn)?個?定義的注解處理器,代碼如下:
測試類如下:
2.對注解處理器進(jìn)?編譯,隨后使?注解處理器對類進(jìn)?編譯
?先需要先對注解處理器進(jìn)?編譯(javac -cp ?于引?第三?jar包進(jìn)?編譯)
然后使?注解處理器對這個Person測試類進(jìn)?編譯:
這時候再看?成的Person.class,可以發(fā)現(xiàn)Setter?法已經(jīng)?成了:
總結(jié)
當(dāng)然盡管測試類已經(jīng)?成Setter?法,但是因為是在編譯時期?成的,因此我們在開發(fā)的時候是沒法直接調(diào)?Setter?法的,因此Lombok提供了插件機(jī)制,?便我們在開發(fā)的時候可以直接去調(diào)?Lombok的特性。
到此這篇關(guān)于Lombok同時使?@Data和@Builder踩坑總結(jié)的文章就介紹到這了,更多相關(guān)Lombok @Data和@Builder內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java Collection 之List學(xué)習(xí)介紹
本篇文章小編為大家介紹,java Collection 之List學(xué)習(xí)介紹。需要的朋友參考下2013-04-04Serializable接口的作用_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了java中Serializable接口的作用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解
這篇文章主要為大家介紹了logstash將mysql數(shù)據(jù)同步到elasticsearch方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12java設(shè)計模式之觀察者模式學(xué)習(xí)
這篇文章主要為大家詳細(xì)介紹了java設(shè)計模式之觀察者模式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-01-01@Transactional解讀(作用、失效場景與解決方式)
這篇文章主要介紹了關(guān)于@Transactional作用、失效場景與解決方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08使用Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用的步驟詳解
Spring 事件監(jiān)聽機(jī)制是 Spring 框架中用于在應(yīng)用程序的不同組件之間進(jìn)行通信的一種機(jī)制,Spring 事件監(jiān)聽機(jī)制基于觀察者設(shè)計模式,使得應(yīng)用程序的各個部分可以解耦,提高模塊化和可維護(hù)性,本文給大家介紹了使用Spring事件監(jiān)聽機(jī)制實(shí)現(xiàn)跨模塊調(diào)用,需要的朋友可以參考下2024-06-06SpringBoot應(yīng)用監(jiān)控Actuator使用隱患及解決方案
SpringBoot的Actuator 模塊提供了生產(chǎn)級別的功能,比如健康檢查,審計,指標(biāo)收集,HTTP 跟蹤等,幫助我們監(jiān)控和管理Spring Boot 應(yīng)用,本文將給大家介紹SpringBoot應(yīng)用監(jiān)控Actuator使用隱患及解決方案,需要的朋友可以參考下2024-07-07java多線程應(yīng)用實(shí)現(xiàn)方法
以前沒有寫筆記的習(xí)慣,現(xiàn)在慢慢的發(fā)現(xiàn)及時總結(jié)是多么的重要了,呵呵。雖然才大二,但是也快要畢業(yè)了,要加油2012-11-11