1. Lombok原理和同時使?@Data和@Builder 的坑

        共 1930字,需瀏覽 4分鐘

         ·

        2022-07-06 10:31

        往期熱門文章:

        1、面試官 | Spring Boot 項目如何統(tǒng)一結(jié)果,統(tǒng)一異常,統(tǒng)一日志?

        2、為什么不建議使用ON DUPLICATE KEY UPDATE?

        3、Java8 Stream,過分絲滑!

        4、8 種最坑SQL語法,工作中踩過嗎?

        5、Java 語言“坑爹” TOP 10

        問題背景

        Lombok使? 同時使?@Data和@Builder ,構(gòu)建無參構(gòu)造器報錯!編譯不通過。如下圖:

        Lombok @Data和@Builder分別單獨分析用法

        Lombok使?@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法??梢院喕覀兇a的開發(fā)。(需要安裝Lombok插件和引?Lombok依賴)。
        例如下?的?個實體類,引?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ù)不感知。

        方法二

        直接使用無參構(gòu)造器+有參構(gòu)造器的方式,@RequiredArgsConstructor 來構(gòu)建有參,@NoArgsConstructor來構(gòu)建無參構(gòu)造器,如圖所示:
        編譯后效果:

        Lombok原理

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

        轉(zhuǎn)自:https://juejin.cn/post/7103011031672176677

        鏈接:樹洞君

        最近熱文閱讀:

        1、面試官 | Spring Boot 項目如何統(tǒng)一結(jié)果,統(tǒng)一異常,統(tǒng)一日志?
        2、為什么不建議使用ON DUPLICATE KEY UPDATE?
        3、Java8 Stream,過分絲滑!
        4、8 種最坑SQL語法,工作中踩過嗎?
        5、Java 語言“坑爹” TOP 10
        6、你還不明白如何解決分布式Session?看這篇就夠了!
        7、能解決 80% 故障的排查思路
        8、程序員坐牢了,會被安排寫代碼嗎?
        9、面試被問Nginx,怎么破?
        10、為什么很多 SpringBoot 開發(fā)者放棄了 Tomcat,選擇了 Undertow?
        關(guān)注公眾號,你想要的Java都在這里

        瀏覽 93
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
          
          

            1. 成 人 国 产 高清 | 黄色视频日韩 | 色男人综合网 | hugeboobs欧美巨大乳 | 啪啪网站入口 |