來源:juejin.cn/post/7103011031672176677
問題背景
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類,?動添加?參構造?法,編譯發現報錯不通過:

最新 Java 開發工具教程:https://www.javastack.cn/devtools/
解決方法
方法一
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. 使??定義的注解處理器編譯代碼,
- 定義?定義注解和注解處理器
?先創建?個 MySetter.java ?定義?個注解,代碼如下:

再實作?個?定義的注解處理器,代碼如下:



測驗類如下:

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

然后使?注解處理器對這個Person測驗類進?編譯:
這時候再看?成的Person.class,可以發現Setter?法已經?成了:


總結
當然盡管測驗類已經?成Setter?法,但是因為是在編譯時期?成的,因此我們在開發的時候是沒法直接調?Setter?法的,因此Lombok提供了插件機制,?便我們在開發的時候可以直接去調?Lombok的特性,
近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508745.html
標籤:Java
