Lombok使用及原理分析


在 java平台上,lombok 提供了簡單的注解的形式來幫助我們消除一些必須有但看起來很臃腫的代碼, 比如屬性的get/set,及對象的toString等方法,特別是相對於 POJO

1. 項目背景

在寫Java程序的時候經常會遇到如下情形:
新建了一個Class類,然后在其中設置了幾個字段,最后還需要花費很多時間來建立getter和setter方法
lombok項目的產生就是為了省去我們手動創建getter和setter方法的麻煩,它能夠在我們編譯源碼的時候自動幫我們生成getter和setter方法。即它最終能夠達到的效果是:在源碼中沒有getter和setter方法,但是在編譯生成的字節碼文件中有getter和setter方法。

2. 使用方法

2.1 在IDEA安裝Lombok Plugin

打開IDEA的Settings面板,並選擇Plugins選項,然后點擊 “Browse repositories..",在輸入框輸入”lombok”,得到搜索結果,選擇第二個,點擊安裝,然后安裝提示重啟IDEA,安裝成功;

2.2 添加Maven依賴

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.6</version>
    </dependency>

2.3 使用

   package com.lombok;
    
    import lombok.Data;
    import lombok.EqualsAndHashCode;
    import java.util.List; 

    @Data
    public class Student {
        String name;
        int sex;
        Integer age;
        String address;
        List<String> books;
    }

2.4 Lombok注解

lombok 提供的注解不多,可以參考官方視頻的講解和官方文檔。
Lombok 注解在線幫助文檔:http://jnb.ociweb.com/jnb/jnbJan2010.html

下面介紹幾個常用的 lombok 注解:

   @Data   :注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、                hashCode、toString 方法
   @Setter:注解在屬性上;為屬性提供 setting 方法
   @Getter:注解在屬性上;為屬性提供 getting 方法
   @Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
   @NoArgsConstructor:注解在類上;為類提供一個無參的構造方法
   @AllArgsConstructor:注解在類上;為類提供一個全參的構造方法

3. 原理分析

自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規范,只要程序實現了該API,就能在javac運行的時候得到調用。

lombok本質上就是這樣的一個實現了"JSR 269 API"的程序。在使用javac的過程中,它產生作用的具體流程如下:

1. javac對源代碼進行分析,生成一棵抽象語法樹(AST) 2. 運行過程中調用實現了"JSR 269 API"的lombok程序 3. 此時lombok就對第一步驟得到的AST進行處理,找到@Data注解所在類對應的語法樹(AST),然后修改該語法樹(AST),增加getter和setter方法定義的相應樹節點 4. javac使用修改后的抽象語法樹(AST)生成字節碼文件

4. 注意事項

  1. Intellij Idea配置的編譯工具為Oracle javac的話,也就直接支持lombok了。
  2. Eclipse中使用的不是Oracle javac這個編譯工具,而是自己實現的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得進行設置,具體是在Eclipse程序目錄中的eclipse.ini文件中添加如下兩行設置:
    -javaagent:[lombok.jar所在路徑]
    -Xbootclasspath/a:[lombok.jar所在路徑]

5. 參考文獻

http://blog.csdn.net/u011299686/article/details/13772305

http://blog.csdn.net/hinstenyhisoka/article/details/50468271

http://blog.csdn.net/tanga842428/article/details/53426589

鏡像地址

http://www.zhangwei.wiki/#/posts/6

pay


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM