Java使用lombok消除冗余代碼的方法步驟
一、項目背景
在寫Java程序的時候經(jīng)常會遇到如下情形:
新建了一個Class類,然后在其中設置了幾個字段,最后還需要花費很多時間來建立getter和setter方法。
lombok項目的產(chǎn)生就是為了省去我們手動創(chuàng)建getter和setter方法的麻煩,它能夠在我們編譯源碼的時候自動幫我們生成getter和setter方法。即它最終能夠達到的效果是:在源碼中沒有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é)碼文件,對其反編譯得到的結(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();
}
二、eclipse安裝lombok
為IDE安裝lombok插件非常簡單,以eclipse環(huán)境為例,其安裝過程分為以下幾個步驟:
1)下載lombok.jar包
lombok的官網(wǎng)地址:https://projectlombok.org/
lombok的下載地址:https://projectlombok.org/download.html
lombok項目的Github地址:https://github.com/rzwitserloot/lombok
2)運行l(wèi)ombok.jar
在windows命令行中輸入以下命令:
java -jar D:\software\lombok.jar
其中D:\software\lombok.jar這是windows下lombok.jar所在的位置, 數(shù)秒后將彈出以下對話框,以指定eclipse的安裝路徑。

3)確認完eclipse的安裝路徑后,點擊install/update按鈕,即可完成安裝。
4)安裝完成之后,請確認eclipse安裝路徑下是否多了一個lombok.jar包,并且其配置文件eclipse.ini中是否 添加了如下內(nèi)容:
-javaagent:lombok.jar -Xbootclasspath/a:lombok.jar
那么恭喜你已經(jīng)安裝成功,否則將缺少的部分添加到相應的位置即可 。
5)重啟eclipse。
三、項目中使用lombok
在項目中使用lombok的方法很簡單,分為四個步驟:
1)在需要自動生成getter和setter方法的類上,加上@Data注解。
2)在編譯類路徑中加入lombok.jar包,若是maven工程,引入相關(guān)依賴即可。
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency>
</dependencies>
3)使用支持lombok的編譯工具編譯源代碼(關(guān)于支持lombok的編譯工具,見“五、支持lombok的編譯工具”)。
4)編譯得到的字節(jié)碼文件中自動生成了getter和setter方法。
四、原理分析
接下來對lombok的工作原理進行分析,以Oracle的javac編譯工具為例。
自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規(guī)范,只要程序?qū)崿F(xiàn)了該API,就能在javac運行的時候得到調(diào)用。
舉例來說,現(xiàn)在有一個實現(xiàn)了"JSR 269 API"的程序A,那么使用javac編譯源碼的時候具體流程如下:
1)javac對源代碼進行分析,生成一棵抽象語法樹(AST)。
2)運行過程中調(diào)用實現(xiàn)了"JSR 269 API"的A程序。
3)此時A程序就可以完成它自己的邏輯,包括修改第一步驟得到的抽象語法樹(AST)。
4)javac使用修改后的抽象語法樹(AST)生成字節(jié)碼文件。
詳細的流程圖如下:

五、支持lombok的編譯工具
1)由“四、原理分析”可知,Oracle javac直接支持lombok。
2)常用的項目管理工具Maven所使用的java編譯工具來源于配置的第三方工具,如果我們配置這個第三方工具為Oracle javac的話,那么Maven也就直接支持lombok了。
3)Intellij Idea配置的編譯工具為Oracle javac的話,也就直接支持lombok了。
4)Eclipse中使用的不是Oracle javac這個編譯工具,而是自己實現(xiàn)的Eclipse Compiler for Java (ECJ).要想使ECJ支持lombok,得進行設置,具體是在Eclipse程序目錄中的eclipse.ini文件中添加如下兩行設置:
-javaagent:[lombok.jar所在路徑] -Xbootclasspath/a:[lombok.jar所在路徑]
六、常用lombok注解
lombok 提供的注解不多,可以參考官方視頻的講解和官方文檔。
Lombok 注解在線幫助文檔:http://projectlombok.org/features/index
下面是幾個比較常用的 lombok 注解:
@Data :注解在類上;提供類所有屬性的 getting 和 setting 方法,此外還提供了equals、canEqual、hashCode、toString 方法
@Setter:注解在屬性上;為屬性提供 setting 方法
@Getter:注解在屬性上;為屬性提供 getting 方法
@Log4j :注解在類上;為類提供一個 屬性名為log 的 log4j 日志對象
@NoArgsConstructor:注解在類上;為類提供一個無參的構(gòu)造方法
@AllArgsConstructor:注解在類上;為類提供一個全參的構(gòu)造方法
七、其他問題
現(xiàn)在使用Intellij Idea作為Java項目的IDE,配置Oracle javac作為編譯工具。
現(xiàn)在有一個A類,其中有一些字段,沒有創(chuàng)建它們的setter和getter方法,使用了lombok的@Data注解,另外有一個B類,它調(diào)用了A類實例的相應字段的setter和getter方法。
編譯A類和B類所在的項目,并不會報錯,因為最終生成的A類字節(jié)碼文件中存在相應字段的setter和getter方法。但是,IDE發(fā)現(xiàn)B類源代碼中所使用的A類實例的setter和getter方法在A類源代碼中找不到定義,IDE會認為這是錯誤。
要解決以上這個不是真正錯誤的錯誤,可以下載安裝Intellij Idea中的"Lombok plugin"。
八、lombok的罪惡
使用lombok雖然能夠省去手動創(chuàng)建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
到此這篇關(guān)于Java使用lombok消除冗余代碼的方法步驟的文章就介紹到這了,更多相關(guān)Java lombok消除冗余代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring/SpringBoot?@RequestParam注解無法讀取application/json格式數(shù)據(jù)問題
RequestParam用于將指定的請求參數(shù)賦值給方法中的形參,可以接受簡單類型屬性,也可以接受對象類型,一般用于GET請求,下面這篇文章主要給大家介紹了關(guān)于Spring/SpringBoot?@RequestParam注解無法讀取application/json格式數(shù)據(jù)問題解決的相關(guān)資料,需要的朋友可以參考下2022-10-10
微服務Spring Boot 整合 Redis 實現(xiàn)UV 數(shù)據(jù)統(tǒng)計的詳
這篇文章主要介紹了微服務Spring Boot 整合 Redis 實現(xiàn) UV 數(shù)據(jù)統(tǒng)計,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-01-01
MyBatis實現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)
這篇文章主要介紹了MyBatis實現(xiàn)批量插入數(shù)據(jù),多重forEach循環(huán)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
SpringBoot應用整合ELK實現(xiàn)日志收集的示例代碼
這篇文章主要介紹了SpringBoot應用整合ELK實現(xiàn)日志收集的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
Mybatis Integer類型參數(shù)值為0時得到為空的解決方法
這篇文章主要介紹了Mybatis Integer類型參數(shù)值為0時得到為空的解決方法,有需要的朋友們可以學習下。2019-08-08
Java線程安全的計數(shù)器簡單實現(xiàn)代碼示例
這篇文章主要介紹了Java線程安全的計數(shù)器簡單實現(xiàn)代碼示例,具有一定參考價值,需要的朋友可以了解下。2017-10-10

