一鸵熟、項(xiàng)目背景
在寫Java程序的時(shí)候經(jīng)常會(huì)遇到如下情形:
新建了一個(gè)Class類,然后在其中設(shè)置了幾個(gè)字段摩窃,最后還需要花費(fèi)很多時(shí)間來(lái)建立getter和setter方法
lombok項(xiàng)目的產(chǎn)生就是為了省去我們手動(dòng)創(chuàng)建getter和setter方法的麻煩花吟,它能夠在我們編譯源碼的時(shí)候自動(dòng)幫我們生成getter和setter方法。即它最終能夠達(dá)到的效果是:在源碼中沒有g(shù)etter和setter方法灾锯,但是在編譯生成的字節(jié)碼文件中有g(shù)etter和setter方法
比如源碼文件:
import java.io.Serializable;
import lombok.Data;
@Data
public class BasicClusterInfo implements Serializable {
private static final long serialVersionUID = 3478135817352393604L;
private String hbaseKey;
private int receiverCount;
}
以下是編譯上述源碼文件得到的字節(jié)碼文件,對(duì)其反編譯得到的結(jié)果
public class BasicClusterInfo extends java.lang.Object implements java.io.Serializable{
public BasicClusterInfo();
public java.lang.String getHbaseKey();
public int getReceiverCount();
public void setHbaseKey(java.lang.String);
public void setReceiverCount(int);
public boolean equals(java.lang.Object);
public boolean canEqual(java.lang.Object);
public int hashCode();
public java.lang.String toString();
}
二嗅榕、使用方法
lombok網(wǎng)址:https://projectlombok.org/download.html
Eclipse支持需要點(diǎn)擊運(yùn)行下載的jar包
Maven依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.6</version>
<scope>provided</scope>
</dependency>
使用lombok項(xiàng)目的方法很簡(jiǎn)單顺饮,分為四個(gè)步驟:
1)在需要自動(dòng)生成getter和setter方法的類上,加上@Data注解
2)在編譯類路徑中加入lombok.jar包
3)使用支持lombok的編譯工具編譯源代碼(關(guān)于支持lombok的編譯工具凌那,見“四兼雄、支持lombok的編譯工具”)
4)編譯得到的字節(jié)碼文件中自動(dòng)生成了getter和setter方法
三、原理分析
接下來(lái)進(jìn)行l(wèi)ombok能夠工作的原理分析帽蝶,以O(shè)racle的javac編譯工具為例赦肋。
自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規(guī)范励稳,只要程序?qū)崿F(xiàn)了該API佃乘,就能在javac運(yùn)行的時(shí)候得到調(diào)用。
舉例來(lái)說(shuō)驹尼,現(xiàn)在有一個(gè)實(shí)現(xiàn)了"JSR 269 API"的程序A,那么使用javac編譯源碼的時(shí)候具體流程如下:
1)javac對(duì)源代碼進(jìn)行分析趣避,生成一棵抽象語(yǔ)法樹(AST)
2)運(yùn)行過程中調(diào)用實(shí)現(xiàn)了"JSR 269 API"的A程序
3)此時(shí)A程序就可以完成它自己的邏輯,包括修改第一步驟得到的抽象語(yǔ)法樹(AST)
4)javac使用修改后的抽象語(yǔ)法樹(AST)生成字節(jié)碼文件
詳細(xì)的流程圖如下:
lombok本質(zhì)上就是這樣的一個(gè)實(shí)現(xiàn)了"JSR 269 API"的程序新翎。在使用javac的過程中程帕,它產(chǎn)生作用的具體流程如下:
1)javac對(duì)源代碼進(jìn)行分析,生成一棵抽象語(yǔ)法樹(AST)
2)運(yùn)行過程中調(diào)用實(shí)現(xiàn)了"JSR 269 API"的lombok程序
3)此時(shí)lombok就對(duì)第一步驟得到的AST進(jìn)行處理料祠,找到@Data注解所在類對(duì)應(yīng)的語(yǔ)法樹(AST)骆捧,然后修改該語(yǔ)法樹(AST)澎羞,增加getter和setter方法定義的相應(yīng)樹節(jié)點(diǎn)
4)javac使用修改后的抽象語(yǔ)法樹(AST)生成字節(jié)碼文件
四髓绽、支持lombok的編譯工具
1)由“三、原理分析”可知妆绞,Oracle javac直接支持lombok
2)常用的項(xiàng)目管理工具M(jìn)aven所使用的java編譯工具來(lái)源于配置的第三方工具顺呕,如果我們配置這個(gè)第三方工具為Oracle javac的話枫攀,那么Maven也就直接支持lombok了
3)Intellij Idea配置的編譯工具為Oracle javac的話,也就直接支持lombok了株茶。
4)Eclipse中使用的不是Oracle javac這個(gè)編譯工具来涨,而是自己實(shí)現(xiàn)的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得進(jìn)行設(shè)置启盛,具體是在Eclipse程序目錄中的eclipse.ini文件中添加如下兩行設(shè)置:
-javaagent:[lombok.jar所在路徑]
-Xbootclasspath/a:[lombok.jar所在路徑]
五蹦掐、其他問題
現(xiàn)在使用Intellij Idea作為Java項(xiàng)目的IDE,配置Oracle javac作為編譯工具僵闯。
現(xiàn)在有一個(gè)A類卧抗,其中有一些字段,沒有創(chuàng)建它們的setter和getter方法鳖粟,使用了lombok的@Data注解社裆,另外有一個(gè)B類,它調(diào)用了A類實(shí)例的相應(yīng)字段的setter和getter方法
編譯A類和B類所在的項(xiàng)目向图,并不會(huì)報(bào)錯(cuò)泳秀,因?yàn)樽罱K生成的A類字節(jié)碼文件中存在相應(yīng)字段的setter和getter方法
但是,IDE發(fā)現(xiàn)B類源代碼中所使用的A類實(shí)例的setter和getter方法在A類源代碼中找不到定義榄攀,IDE會(huì)認(rèn)為這是錯(cuò)誤
要解決以上這個(gè)不是真正錯(cuò)誤的錯(cuò)誤嗜傅,可以下載安裝Intellij Idea中的"Lombok plugin"。
六檩赢、lombok的罪惡
使用lombok雖然能夠省去手動(dòng)創(chuàng)建setter和getter方法的麻煩磺陡,但是卻大大降低了源代碼文件的可讀性和完整性,降低了閱讀源代碼的舒適度漠畜。
參考文獻(xiàn)
[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