問題背景
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的特性。
-
JAVA
+關注
關注
19文章
2974瀏覽量
105138 -
Data
+關注
關注
0文章
62瀏覽量
38332 -
編譯
+關注
關注
0文章
661瀏覽量
33040 -
插件
+關注
關注
0文章
336瀏覽量
22492 -
Builder
+關注
關注
1文章
23瀏覽量
11230
原文標題:Lombok 同時使用 @Data 和 @Builder 的巨坑,千萬別亂用!
文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
如何避開智能硬件創業的那些坑!
對于28335的SPI的FIFO接收,必須要發送與接收同時開啟嗎?
數據包解密必須要配置哪些
stm32hal庫之外部中斷巨坑
智能音箱想要成功 必須要先弄清楚這3個問題
![智能音箱想要成功 <b class='flag-5'>必須要</b>先弄清楚這3<b class='flag-5'>個</b>問題](https://file.elecfans.com/web1/M00/7E/C3/pIYBAFwYtxuASgDQAAGyUCxUgiI614.png)
三極管,三個必須要掌握的“判別方法”資料下載
![三極管,三<b class='flag-5'>個</b><b class='flag-5'>必須要</b>掌握的“判別方法”資料下載](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Lombok開發插件使用小技巧
重演自己如何掉入Lombok的戲法陷阱
發現一個Spring事務的巨坑bug 你必須要小心了
Lombok如何派上用場
小程序開發“巨坑”多,華為云這款輕量應用服務器輕松避坑
![小程序開發“<b class='flag-5'>巨</b><b class='flag-5'>坑</b>”多,華為云這款輕量應用服務器輕松避<b class='flag-5'>坑</b>](https://file1.elecfans.com//web2/M00/B0/78/wKgaomVeMhaAbrKiAAAxj6SV2MI08.jpeg)
評論