最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中的Lombok使用及工作原理詳解

 更新時(shí)間:2023年10月02日 09:50:21   作者:Archie_java  
這篇文章主要介紹了Java中的Lombok使用及工作原理詳解,Lombok是一個(gè)Java庫,能自動(dòng)插入編輯器并構(gòu)建工具,簡化Java開發(fā),通過添加注解的方式,不需要為類編寫getter或eques方法,同時(shí)可以自動(dòng)化日志變量,需要的朋友可以參考下

1.Lombok簡介

大概的意思:Lombok是一個(gè)Java庫,能自動(dòng)插入編輯器并構(gòu)建工具,簡化Java開發(fā)。通過添加注解的方式,不需要為類編寫getter或eques方法,同時(shí)可以自動(dòng)化日志變量。官網(wǎng)鏈接

簡而言之:Lombok能以簡單的注解形式來簡化java代碼,提高開發(fā)人員的開發(fā)效率。

2.Lombok使用

使用Lombok需要的開發(fā)環(huán)境Java+Maven+IntelliJ IDEA或者Eclipse(安裝Lombok Plugin)

2.1添加maven依賴

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.4</version>
    <scope>provided</scope>
</dependency>

2.2安裝插件

使用Lombok還需要插件的配合,我使用開發(fā)工具為idea,這里只講解idea中安裝lombok插件,使用eclipse和myeclipse的小伙伴和自行g(shù)oogle安裝方法。 打開idea的設(shè)置,點(diǎn)擊Plugins,點(diǎn)擊Browse repositories,在彈出的窗口中搜索lombok,然后安裝即可

img

2.3解決編譯時(shí)出錯(cuò)問題

編譯時(shí)出錯(cuò),可能是沒有enable注解處理器。

Annotation Processors > Enable annotation processing 。設(shè)置完成之后程序正常運(yùn)行。

img

2.4示例

下面舉兩個(gè)栗子,看看使用lombok和不使用的區(qū)別。

創(chuàng)建一個(gè)用戶類

不使用Lombok

public class User implements Serializable {
    private static final long serialVersionUID = -8054600833969507380L;
    private Integer id;
    private String username;
    private Integer age;
    public User() {
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        User user = (User) o;
        return Objects.equals(id, user.id) &&
                Objects.equals(username, user.username) &&
                Objects.equals(age, user.age);
    }
    @Override
    public int hashCode() {
        return Objects.hash(id, username, age);
    }
}

使用Lombok

@Data
public class User implements Serializable {
    private static final long serialVersionUID = -8054600833969507380L;
    private Integer id;
    private String username;
    private Integer age;
}

編譯源文件,然后反編譯class文件,反編譯結(jié)果如下圖。

說明@Data注解在類上,會為類的所有屬性自動(dòng)生成setter/getter、equals、canEqual、hashCode、toString方法,如為final屬性,則不會為該屬性生成setter方法。

img

自動(dòng)化日志變量

@Slf4j
@RestController
@RequestMapping(("/user"))
public class UserController {
    @GetMapping("/getUserById/{id}")
    public User getUserById(@PathVariable Integer id) {
        User user = new User();
        user.setUsername("風(fēng)清揚(yáng)");
        user.setAge(21);
        user.setId(id);
        if (log.isInfoEnabled()) {
            log.info("用戶 {}", user);
        }
        return user;
    }
}

通過反編譯可以看到@Slf4j注解生成了log日志變量(嚴(yán)格意義來說是常量),無需去聲明一個(gè)log就可以在類中使用log記錄日志。

img

2.5常用注解

下面介紹一下常用的幾個(gè)注解:

  • @Setter 注解在類或字段,注解在類時(shí)為所有字段生成setter方法,注解在字段上時(shí)只為該字段生成setter方法。
  • @Getter 使用方法同上,區(qū)別在于生成的是getter方法。
  • @ToString 注解在類,添加toString方法。
  • @EqualsAndHashCode 注解在類,生成hashCode和equals方法。
  • @NoArgsConstructor 注解在類,生成無參的構(gòu)造方法。
  • @RequiredArgsConstructor 注解在類,為類中需要特殊處理的字段生成構(gòu)造方法,比如final和被@NonNull注解的字段。
  • @AllArgsConstructor 注解在類,生成包含類中所有字段的構(gòu)造方法。
  • @Data 注解在類,生成setter/getter、equals、canEqual、hashCode、toString方法,如為final屬性,則不會為該屬性生成setter方法。
  • @Slf4j 注解在類,生成log變量,嚴(yán)格意義來說是常量。private static final Logger log = LoggerFactory.getLogger(UserController.class);

3.Lombok工作原理

在Lombok使用的過程中,只需要添加相應(yīng)的注解,無需再為此寫任何代碼。自動(dòng)生成的代碼到底是如何產(chǎn)生的呢?

核心之處就是對于注解的解析上。JDK5引入了注解的同時(shí),也提供了兩種解析方式。

運(yùn)行時(shí)解析 運(yùn)行時(shí)能夠解析的注解,必須將@Retention設(shè)置為RUNTIME,這樣就可以通過反射拿到該注解。java.lang.reflect反射包中提供了一個(gè)接口AnnotatedElement,該接口定義了獲取注解信息的幾個(gè)方法,Class、Constructor、Field、Method、Package等都實(shí)現(xiàn)了該接口,對反射熟悉的朋友應(yīng)該都會很熟悉這種解析方式。

編譯時(shí)解析 編譯時(shí)解析有兩種機(jī)制,分別簡單描述下:

1)Annotation Processing Tool

apt自JDK5產(chǎn)生,JDK7已標(biāo)記為過期,不推薦使用,JDK8中已徹底刪除,自JDK6開始,可以使用Pluggable Annotation Processing API來替換它,apt被替換主要有2點(diǎn)原因:

  • api都在com.sun.mirror非標(biāo)準(zhǔn)包下   
  • 沒有集成到j(luò)avac中,需要額外運(yùn)行

2)Pluggable Annotation Processing API

JSR 269自JDK6加入,作為apt的替代方案,它解決了apt的兩個(gè)問題,javac在執(zhí)行的時(shí)候會調(diào)用實(shí)現(xiàn)了該API的程序,這樣我們就可以對編譯器做一些增強(qiáng),javac執(zhí)行的過程如下:

img

Lombok本質(zhì)上就是一個(gè)實(shí)現(xiàn)了“JSR 269 API”的程序。在使用javac的過程中,它產(chǎn)生作用的具體流程如下:

1.javac對源代碼進(jìn)行分析,生成了一棵抽象語法樹(AST)

2.運(yùn)行過程中調(diào)用實(shí)現(xiàn)了“JSR 269 API”的Lombok程序

3.此時(shí)Lombok就對第一步驟得到的AST進(jìn)行處理,找到@Data注解所在類對應(yīng)的語法樹(AST),然后修改該語法樹(AST),增加getter和setter方法定義的相應(yīng)樹節(jié)點(diǎn)

4.javac使用修改后的抽象語法樹(AST)生成字節(jié)碼文件,即給class增加新的節(jié)點(diǎn)(代碼塊)

通過讀Lombok源碼,發(fā)現(xiàn)對應(yīng)注解的實(shí)現(xiàn)都在HandleXXX中,比如@Getter注解的實(shí)現(xiàn)在HandleGetter.handle()。還有一些其它類庫使用這種方式實(shí)現(xiàn),比如Google Auto、Dagger等等。

4.Lombok的優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

(1)能通過注解的形式自動(dòng)生成構(gòu)造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發(fā)效率

(2)讓代碼變得簡潔,不用過多的去關(guān)注相應(yīng)的方法

(3)屬性做修改時(shí),也簡化了維護(hù)為這些屬性所生成的getter/setter方法等

缺點(diǎn):

(1)不支持多種參數(shù)構(gòu)造器的重載

(2)雖然省去了手動(dòng)創(chuàng)建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度

到此這篇關(guān)于Java中的Lombok使用及工作原理詳解的文章就介紹到這了,更多相關(guān)Java中的Lombok使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文讀懂JAVA中HttpURLConnection的用法

    一文讀懂JAVA中HttpURLConnection的用法

    這篇文章主要介紹了JAVA中的HttpURLConnection用法,文中講解非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Java實(shí)現(xiàn)EasyCaptcha圖形驗(yàn)證碼的具體使用

    Java實(shí)現(xiàn)EasyCaptcha圖形驗(yàn)證碼的具體使用

    Java圖形驗(yàn)證碼,支持gif、中文、算術(shù)等類型,可用于Java Web、JavaSE等項(xiàng)目,下面就跟隨小編一起來了解一下
    2021-08-08
  • resultMap標(biāo)簽中里的collection標(biāo)簽詳解

    resultMap標(biāo)簽中里的collection標(biāo)簽詳解

    這篇文章主要介紹了resultMap標(biāo)簽中里的collection標(biāo)簽,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java SMM框架關(guān)聯(lián)關(guān)系映射示例講解

    Java SMM框架關(guān)聯(lián)關(guān)系映射示例講解

    SSM框架是spring MVC ,spring和mybatis框架的整合,是標(biāo)準(zhǔn)的MVC模式,將整個(gè)系統(tǒng)劃分為表現(xiàn)層,controller層,service層,DAO層四層,使用spring MVC負(fù)責(zé)請求的轉(zhuǎn)發(fā)和視圖管理,spring實(shí)現(xiàn)業(yè)務(wù)對象管理,mybatis作為數(shù)據(jù)對象的持久化引擎
    2022-08-08
  • swagger中如何給請求添加header

    swagger中如何給請求添加header

    這篇文章主要介紹了swagger中如何給請求添加header,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • mybatis攔截器與分頁插件實(shí)例教程

    mybatis攔截器與分頁插件實(shí)例教程

    Mybatis攔截器常常會被用來進(jìn)行分頁處理。所以下面這篇文章主要給大家介紹了關(guān)于mybatis攔截器與分頁插件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 使用maven命令安裝jar包到本地倉庫的方法步驟

    使用maven命令安裝jar包到本地倉庫的方法步驟

    這篇文章主要介紹了使用maven命令安裝jar包到本地倉庫的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Java面向?qū)ο筇匦栽斀庵庋b篇

    Java面向?qū)ο筇匦栽斀庵庋b篇

    Java是一種廣泛使用的面向?qū)ο缶幊陶Z言,它支持封裝、繼承和多態(tài)等核心概念,這些都是面向?qū)ο缶幊谭妒降闹匾M成部分,這篇文章主要介紹了Java面向?qū)ο筇匦栽斀庵庋b篇的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • springboot FeignClient注解及參數(shù)

    springboot FeignClient注解及參數(shù)

    這篇文章主要介紹了springboot FeignClient注解及參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項(xiàng)目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下
    2024-05-05

最新評論

娱乐| 合江县| 新泰市| 连云港市| 霸州市| 漳州市| 竹山县| 文山县| 双江| 曲阳县| 财经| 巴中市| 鄂州市| 舟曲县| 洱源县| 苍山县| 长阳| 刚察县| 宁安市| 怀仁县| 乌什县| 宜君县| 巴青县| 重庆市| 始兴县| 德清县| 靖州| 合作市| 三门县| 阿图什市| 额敏县| 库车县| 霞浦县| 旬邑县| 紫金县| 龙江县| 枣庄市| 乌恰县| 长治县| 南溪县| 肃宁县|