<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1846字,需瀏覽 4分鐘

           ·

          2022-07-09 06:53

          程序員的成長之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享 
          關(guān)注


          閱讀本文大概需要 2.8 分鐘。

          來自:https://juejin.cn/post/7103011031672176677

          問題背景


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


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


          Lombok使?@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法。可以簡化我們代碼的開發(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é)碼?成->?成?進制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.對注解處理器進?編譯,隨后使?注解處理器對類進?編譯

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


          然后使?注解處理器對這個Person測試類進?編譯:

          這時候再看?成的Person.class,可以發(fā)現(xiàn)Setter?法已經(jīng)?成了:


          總結(jié)


          當(dāng)然盡管測試類已經(jīng)?成Setter?法,但是因為是在編譯時期?成的,因此我們在開發(fā)的時候是沒法直接調(diào)?Setter?法的,因此Lombok提供了插件機制,?便我們在開發(fā)的時候可以直接去調(diào)?Lombok的特性。
          <END>

          推薦閱讀:

          知乎高贊:計算機專業(yè)會不會成為下一個土木?

          多線程使用不當(dāng)導(dǎo)致的 OOM

          互聯(lián)網(wǎng)初中高級大廠面試題(9個G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!                                  朕已閱 

          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  男人的天堂青青草 | 看看欧美黑人操逼免费的 | 操屄视频大全 | 国产精品99久久久久久成人 | AV官网 |