Lombok
LomBok存在的意義
Lombok能以簡單的注解形式來簡化java代碼,提高開發(fā)人員的開發(fā)效率。
例如開發(fā)中經(jīng)常需要寫的javaBean,都需要花時間去添加相應的getter/setter,也許還要去寫構造器、equals等方法,而且需要維護,當屬性多時會出現(xiàn)大量的getter/setter方法。
Lombok能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。
Lombok官網(wǎng):https://projectlombok.org
各注解官網(wǎng)解析:https://projectlombok.org/features/all
Maven依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
</dependency>
IDEA安裝lombok插件
由于lombok的注解屬于編譯時解析注解 (后面會說到),所以在編寫代碼時,IDE并會認為此實體類沒有get set,所以調用時會報錯。此時就需要安裝插件了,IDEA和Eclipse都有相應插件,搜lombok就行。
以下是idea安裝插件的方法:
File-->Settings-->Plugins 右側下方瀏覽庫 Browse repositories... 然后搜索lombok

常用注解
| 注解 | 說明 |
|---|---|
| @Data | 注解在類上,會為類的所有屬性自動生成setter/getter、equals、canEqual、hashCode、toString方法,如為final屬性,則不會為該屬性生成setter方法。 |
| @Getter/@Setter | 此注解在屬性上,可以為相應的屬性自動生成Getter/Setter方法 |
| @NonNull | 該注解用在屬性或構造器上,Lombok會生成一個非空的聲明,可用于校驗參數(shù),能幫助避免空指針。 |
| @Cleanup | 該注解能幫助我們自動調用close()方法,例如IO流。 |
| @EqualsAndHashCode | 默認情況下,會使用所有非靜態(tài)(non-static)和非瞬態(tài)(non-transient)屬性來生成equals和hasCode,也能通過exclude注解來排除一些屬性。 |
| @ToString | 類使用@ToString注解,Lombok會生成一個toString()方法,默認情況下,會輸出類名、所有屬性(會按照屬性定義順序),用逗號來分割。通過將includeFieldNames參數(shù)設為true,就能明確的輸出toString()屬性。這一點是不是有點繞口,通過代碼來看會更清晰些。 |
| @NoArgsConstructor | 無參構造器 |
| @RequiredArgsConstructor | 部分參數(shù)構造器 |
| @AllArgsConstructor | 全參構造器 |
詳細內容,非常建議到lombok官網(wǎng)查看實例,簡單易懂
Lombok工作原理
自動生成的代碼到底是如何產(chǎn)生的呢?核心之處就是對于注解的解析上。JDK5引入了注解的同時,也提供了兩種解析方式。
- 運行時解析
運行時能夠解析的注解,必須將@Retention設置為RUNTIME,這樣就可以通過反射拿到該注解。java.lang.reflect反射包中提供了一個接口AnnotatedElement,該接口定義了獲取注解信息的幾個方法,Class、Constructor、Field、Method、Package等都實現(xiàn)了該接口,對反射熟悉的朋友應該都會很熟悉這種解析方式。
- 編譯時解析
編譯時解析有兩種機制,分別簡單描述下:
-
Annotation Processing Tool
apt自JDK5產(chǎn)生,JDK7已標記為過期,不推薦使用,JDK8中已徹底刪除,自JDK6開始,可以使用Pluggable Annotation Processing API來替換它,apt被替換主要有2點原因:- api都在com.sun.mirror非標準包下
- 沒有集成到javac中,需要額外運行
-
Pluggable Annotation Processing API
JSR 269自JDK6加入,作為apt的替代方案,它解決了apt的兩個問題,javac在執(zhí)行的時候會調用實現(xiàn)了該API的程序,這樣我們就可以對編譯器做一些增強,javac執(zhí)行的過程如下:
lombok工作原理
Lombok本質上就是一個實現(xiàn)了“JSR 269 API”的程序。在使用javac的過程中,它產(chǎn)生作用的具體流程如下:
- javac對源代碼進行分析,生成了一棵抽象語法樹(AST)
- 運行過程中調用實現(xiàn)了“JSR 269 API”的Lombok程序
- 此時Lombok就對第一步驟得到的AST進行處理,找到@Data注解所在類對應的語法樹(AST),然后修改該語法樹(AST),增加getter和setter方法定義的相應樹節(jié)點
- javac使用修改后的抽象語法樹(AST)生成字節(jié)碼文件,即給class增加新的節(jié)點(代碼塊)
通過讀Lombok源碼,發(fā)現(xiàn)對應注解的實現(xiàn)都在HandleXXX中,比如@Getter注解的實現(xiàn)在HandleGetter.handle()。還有一些其它類庫使用這種方式實現(xiàn),比如Google Auto、Dagger等等。
Lombok的優(yōu)缺點
- 優(yōu)點:
- 能通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發(fā)效率
- 讓代碼變得簡潔,不用過多的去關注相應的方法
- 屬性做修改時,也簡化了維護為這些屬性所生成的getter/setter方法等
- 缺點:
- 不支持多種參數(shù)構造器的重載
- 雖然省去了手動創(chuàng)建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度
版權聲明:文章內容總結于網(wǎng)絡,如侵犯到原作者權益,請與我聯(lián)系刪除或授權事宜
