lombok的使用和原理

1、項目背景
在寫Java程序的時候常常會遇到以下情形:
新建了一個Class類,而後在其中設置了幾個字段,最後還須要花費不少時間來創建getter和setter方法
lombok項目的產生就是爲了省去咱們手動建立getter和setter方法的麻煩,它可以在咱們編譯源碼的時候自動幫咱們生成getter和setter方法。即它最終可以達到的效果是:在源碼中沒有getter和setter方法,可是在編譯生成的字節碼文件中有getter和setter方法
好比源碼文件:
 
  1. import java.io.Serializable;  
  2.   
  3.   
  4. import lombok.Data;  
  5.   
  6.   
  7. @Data   
  8. public class BasicClusterInfo implements Serializable {  
  9.   
  10.   
  11.     private static final long serialVersionUID = 3478135817352393604L;  
  12.     private String            hbaseKey;  
  13.     private int               receiverCount;  
  14. }  


如下是編譯上述源碼文件獲得的字節碼文件,對其反編譯獲得的結果
 
  1. public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{  
  2.     public BasicClusterInfo();  
  3.     public java.lang.String getHbaseKey();  
  4.     public int getReceiverCount();  
  5.     public void setHbaseKey(java.lang.String);  
  6.     public void setReceiverCount(int);  
  7.     public boolean equals(java.lang.Object);  
  8.     public boolean canEqual(java.lang.Object);  
  9.     public int hashCode();  
  10.     public java.lang.String toString();  
  11. }  


2、使用方法
使用lombok項目的方法很簡單,分爲四個步驟:
1)在須要自動生成getter和setter方法的類上,加上@Data註解
2)在編譯類路徑中加入lombok.jar包
3)使用支持lombok的編譯工具編譯源代碼(關於支持lombok的編譯工具,見「4、支持lombok的編譯工具」)
4)編譯獲得的字節碼文件中自動生成了getter和setter方法


3、原理分析
接下來進行lombok可以工做的原理分析,以Oracle的javac編譯工具爲例。
自從Java 6起,javac就支持「JSR 269 Pluggable Annotation Processing API」規範,只要程序實現了該API,就能在javac運行的時候獲得調用。
舉例來講,如今有一個實現了"JSR 269 API"的程序A,那麼使用javac編譯源碼的時候具體流程以下:
1)javac對源代碼進行分析,生成一棵抽象語法樹(AST)
2)運行過程當中調用實現了"JSR 269 API"的A程序
3)此時A程序就能夠完成它本身的邏輯,包括修改第一步驟獲得的抽象語法樹(AST)
4)javac使用修改後的抽象語法樹(AST)生成字節碼文件
詳細的流程圖以下:



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、支持lombok的編譯工具
1)由「3、原理分析」可知,Oracle javac直接支持lombok
2)經常使用的項目管理工具Maven所使用的java編譯工具來源於配置的第三方工具,若是咱們配置這個第三方工具爲Oracle javac的話,那麼Maven也就直接支持lombok了
3)Intellij Idea配置的編譯工具爲Oracle javac的話,也就直接支持lombok了。
4)Eclipse中使用的不是Oracle javac這個編譯工具,而是本身實現的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得進行設置,具體是在Eclipse程序目錄中的eclipse.ini文件中添加以下兩行設置:
-javaagent:[lombok.jar所在路徑]
-Xbootclasspath/a:[lombok.jar所在路徑]


5、其餘問題
如今使用Intellij Idea做爲Java項目的IDE,配置Oracle javac做爲編譯工具。
如今有一個A類,其中有一些字段,沒有建立它們的setter和getter方法,使用了lombok的@Data註解,另外有一個B類,它調用了A類實例的相應字段的setter和getter方法
編譯A類和B類所在的項目,並不會報錯,由於最終生成的A類字節碼文件中存在相應字段的setter和getter方法
可是,IDE發現B類源代碼中所使用的A類實例的setter和getter方法在A類源代碼中找不到定義,IDE會認爲這是錯誤
要解決以上這個不是真正錯誤的錯誤,能夠下載安裝Intellij Idea中的"Lombok plugin"。


6、lombok的罪惡
使用lombok雖然可以省去手動建立setter和getter方法的麻煩,可是卻大大下降了源代碼文件的可讀性和完整性,下降了閱讀源代碼的溫馨度。




參考文獻:
[1]http://stackoverflow.com/questions/6107197/how-does-lombok-work
[2]https://projectlombok.org/download.html
[3]http://stackoverflow.com/questions/3061654/what-is-the-difference-between-javac-and-the-eclipse-compiler
[4]http://www.ibm.com/developerworks/library/j-lombok/
[5]http://notatube.blogspot.com/2010/12/project-lombok-creating-custom.html
相關文章
相關標籤/搜索