<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同時(shí)使?@Data和@Builder 的坑

          共 1916字,需瀏覽 4分鐘

           ·

          2022-07-06 11:44

          往期熱門文章:

          1、IntelliJ IDEA快捷鍵大全 + 動(dòng)圖演示,建議收藏!
          2、如何防止你的 jar 被反編譯?
          3、大公司為什么禁止SpringBoot項(xiàng)目使用Tomcat?
          4、Java 8 的 Stream 不好調(diào)試?別逗了!IDEA 調(diào)試就能輕松搞定!!
          5、如何用 Java 幾分鐘處理完 30 億個(gè)數(shù)據(jù)?

          問(wèn)題背景

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

          Lombok @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ò):

          解決方法

          方法一

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

          方法二

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

          Lombok原理

          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)?成了:

          總結(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的特性。

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

          鏈接:樹(shù)洞君

          往期熱門文章:

          1、計(jì)算機(jī)專業(yè)會(huì)不會(huì)成為下一個(gè)土木?
          2、xxl-job驚艷的設(shè)計(jì),怎能叫人不愛(ài)
          3、ArrayList#subList這四個(gè)坑,一不小心就中招
          4、面試官:大量請(qǐng)求 Redis 不存在的數(shù)據(jù),從而影響數(shù)據(jù)庫(kù),該如何解決?
          5、MySQL 暴跌!
          6、超越 Xshell!號(hào)稱下一代 Terminal 終端神器,用完愛(ài)不釋手!
          7、IDEA 官宣全新默認(rèn) UI,太震撼了!!
          8、讓你直呼「臥槽」的 GitHub 項(xiàng)目!
          9、Kafka又笨又重,為啥不選Redis?
          10、50多個(gè)高頻免費(fèi) API 接口分享

          瀏覽 37
          點(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>
                  3344成年免 | 精品一区二区三区东京热 | 可以免费看的黄色视频网站 | 小處女末发育嫩苞AV | 老鸭窝AV在线 |