<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>

          Java避坑指南:Lombok同時(shí)使?@Data和@Builder 的坑

          共 4516字,需瀏覽 10分鐘

           ·

          2022-09-29 18:00

          關(guān)注Java學(xué)習(xí)之道一起成長(zhǎng),一起學(xué)習(xí)~

          作者: 樹(shù)洞君
          來(lái)源: juejin.cn/post/7103011031672176677

          Part1問(wèn)題背景

          Lombok使? 同時(shí)使?@Data和@Builder ,構(gòu)建無(wú)參構(gòu)造器報(bào)錯(cuò)!編譯不通過(guò)。如下圖:

          Part2Lombok @Data和@Builder分別單獨(dú)分析用法

          Lombok使?@Data可以?成?參構(gòu)造和類??所有屬性的getter/setter?法。可以簡(jiǎn)化我們代碼的開(kāi)發(fā)。(需要安裝Lombok插件和引?Lombok依賴)。

          例如下?的?個(gè)實(shí)體類,引?Lombok后,可以?動(dòng)?成GET/SET?法和?參構(gòu)造函數(shù)。

          編譯后的class為:可以看到不僅幫我們生成了get和set ,同時(shí)也有默認(rèn)的無(wú)參構(gòu)造器

          那么怎么自動(dòng)生成有參構(gòu)造器呢?使用@Builder注解,將會(huì)幫助我們?成全屬性的構(gòu)造?法。

          編譯后的class為:可以看到 已經(jīng)幫我們構(gòu)建好了全屬性的構(gòu)造方法,但是如果值只引用@Builder注解是無(wú)法生成get和set的。

          但是如果同時(shí)使?@Data和@Builder的話,可以看出盡管?成了GET/SET?法,但是?參構(gòu)造?法沒(méi)有了,這顯然是不能接受的,因?yàn)楹芏嗫蚣芏紩?huì)調(diào)??參構(gòu)造去創(chuàng)建對(duì)象。

          編譯后的class:

          我們嘗試在Tet1類,?動(dòng)添加?參構(gòu)造?法。編譯發(fā)現(xiàn)報(bào)錯(cuò)不通過(guò):

          Part3解決方法

          1方法一

          Lombok同時(shí)使?@Data和@Builder的時(shí)候,如果要?成?參構(gòu)造,需要在代碼???動(dòng)引?注解@Tolerate,讓Lombok在?成類的時(shí)候,對(duì)指定的構(gòu)造函數(shù)不感知。

          2方法二(感謝評(píng)論區(qū) 九又四分之三 提供思路)

          直接使用無(wú)參構(gòu)造器+有參構(gòu)造器的方式,@RequiredArgsConstructor 來(lái)構(gòu)建有參,@NoArgsConstructor來(lái)構(gòu)建無(wú)參構(gòu)造器,如圖所示:

          編譯后效果:

          Part4Lombok原理

          Java的編譯分為以下?個(gè)階段:

          解析與填充符號(hào)表->注解處理->分析與字節(jié)碼?成->?成?進(jìn)制class?件。

          • Lombok 使?的是 JDK 6 實(shí)現(xiàn)的 JSR 269: Pluggable Annotation Processing API (編譯期的注解處理器),它是在編譯期時(shí)把 Lombok 的注解代碼,轉(zhuǎn)換為常規(guī)的 Java ?法?實(shí)現(xiàn)注?。
          • 在編譯期階段,當(dāng) Java 源碼被抽象成語(yǔ)法樹(shù) (AST) 之后,Lombok 會(huì)根據(jù)??的注解處理器動(dòng)態(tài)的修改AST,增加新的代碼 (節(jié)點(diǎn)),在這?切執(zhí)?之后,再通過(guò)分析?成了最終的字節(jié)碼 (.class) ?件,這就是Lombok 的執(zhí)?原理。

          可以借助注解處理器實(shí)現(xiàn)?個(gè)簡(jiǎn)單的 Setter,我們的實(shí)現(xiàn)步驟是:

          • ?定義?個(gè)注解標(biāo)簽接?,并實(shí)現(xiàn)?個(gè)?定義的注解處理器;
          • 利? tools.jar 的 javac api 處理 AST (抽象語(yǔ)法樹(shù))3. 使??定義的注解處理器編譯代碼。

          1.定義?定義注解和注解處理器

          ?先創(chuàng)建?個(gè) MySetter.java ?定義?個(gè)注解,代碼如下:

          再實(shí)現(xiàn)?個(gè)?定義的注解處理器,代碼如下:

          測(cè)試類如下:

          2.對(duì)注解處理器進(jìn)?編譯,隨后使?注解處理器對(duì)類進(jìn)?編譯

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

          然后使?注解處理器對(duì)這個(gè)Person測(cè)試類進(jìn)?編譯:

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

          Part5總結(jié)

          當(dāng)然盡管測(cè)試類已經(jīng)?成Setter?法,但是因?yàn)槭窃诰幾g時(shí)期?成的,因此我們?cè)陂_(kāi)發(fā)的時(shí)候是沒(méi)法直接調(diào)?Setter?法的,因此Lombok提供了插件機(jī)制,?便我們?cè)陂_(kāi)發(fā)的時(shí)候可以直接去調(diào)?Lombok的特性。

          -- END --

           | 更多精彩文章 -



          ← 左右滑動(dòng)與Java學(xué)習(xí)之道互動(dòng)交流 →

             
                    
          加我微信,交個(gè)朋友
                   
          長(zhǎng)按/掃碼添加↑↑↑
                          

          瀏覽 91
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <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视频在线看 | 免费看一级A沽 | 综合自拍偷拍网 | 欧美性爱免费在线视频PK视频 |