Lombok學習與應用

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

idea安裝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)生作用的具體流程如下:

  1. javac對源代碼進行分析,生成了一棵抽象語法樹(AST)
  2. 運行過程中調用實現(xiàn)了“JSR 269 API”的Lombok程序
  3. 此時Lombok就對第一步驟得到的AST進行處理,找到@Data注解所在類對應的語法樹(AST),然后修改該語法樹(AST),增加getter和setter方法定義的相應樹節(jié)點
  4. 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)點:
  1. 能通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發(fā)效率
  2. 讓代碼變得簡潔,不用過多的去關注相應的方法
  3. 屬性做修改時,也簡化了維護為這些屬性所生成的getter/setter方法等
  • 缺點:
  1. 不支持多種參數(shù)構造器的重載
  2. 雖然省去了手動創(chuàng)建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度

版權聲明:文章內容總結于網(wǎng)絡,如侵犯到原作者權益,請與我聯(lián)系刪除或授權事宜

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容