lombok 插件

Lombok能以簡單的註解形式來簡化java代碼,提升開發人員的開發效率。java

使用

導包

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.20</version>
    <scope>provided</scope>
</dependency>
複製代碼

安裝lombok插件

IDEA 編輯器安裝 lombok 插件spring

註解

  • @Data: @Data註解在類上,會爲類的全部屬性自動生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法
  • @Getter、@Setter:註解在類上,會爲類的全部屬性自動生成Getter、Setter方法
  • @ToString:註解在類,會爲類生成一個toString()方法,默認狀況下,會輸出類名、全部屬性(會按照屬性定義順序),用逗號來分割。
  • @NoArgsConstructor、 @AllArgsConstructor:註解在類,會爲類生成無參構造器、全參構造器

實例

Lombok 工做原理

代碼是如何自動生成的?api

核心之處就是對於註解的解析上bash

JDK5引入了註解的同時,也提供了兩種解析方式。mybatis

運行時解析架構

運行時可以解析的註解,必須將 @Retention 設置爲 RUNTIME ,這樣就能夠經過反射拿到該註解。java.lang,reflect 反射包中提供了一個接口 AnnotatedElement ,該接口定義了獲取註解信息的幾個方法,Class、Constructor、Field、Method、Package 等都實現了該接口。eclipse

編譯時解析編輯器

編譯時解析有兩種機制,分別簡單描述下:ide

  1. Annotation Processing Tool

apt自JDK5產生,JDK7已標記爲過時,不推薦使用,JDK8中已完全刪除,自JDK6開始,可使用Pluggable Annotation Processing API來替換它,apt被替換主要有2點緣由:性能

api都在com.sun.mirror非標準包下 沒有集成到javac中,須要額外運行

  1. Pluggable Annotation Processing API

JSR 269自JDK6加入,做爲apt的替代方案,它解決了apt的兩個問題,javac在執行的時候會調用實現了該API的程序,這樣咱們就能夠對編譯器作一些加強,這時javac執行的過程以下:

Lombok本質上就是一個實現了「JSR 269 API」的程序。在使用javac的過程當中,它產生做用的具體流程以下:

javac對源代碼進行分析,生成了一棵抽象語法樹(AST) 運行過程當中調用實現了「JSR 269 API」的Lombok程序 此時Lombok就對第一步驟獲得的AST進行處理,找到@Data註解所在類對應的語法樹(AST),而後修改該語法樹(AST),增長getter和setter方法定義的相應樹節點 javac使用修改後的抽象語法樹(AST)生成字節碼文件,即給class增長新的節點(代碼塊)

總結

Lombok雖然有不少優勢,但Lombok更相似於一種IDE插件,項目也須要依賴相應的jar包

Lombok依賴jar包是由於編譯時要用它的註解,爲何說它又相似插件?由於在使用時,eclipse或IntelliJ IDEA都須要安裝相應的插件,在編譯器編譯時經過操做AST(抽象語法樹)改變字節碼生成,變向的就是說它在改變java語法。 它不像spring的依賴注入或者mybatis的ORM同樣是運行時的特性,而是編譯時的特性。

這裏我我的最感受不爽的地方就是對插件的依賴!由於Lombok只是省去了一些人工生成代碼的麻煩,但IDE都有快捷鍵來協助生成getter/setter等方法,也很是方便。

知乎上有位大神發表過對Lombok的一些見解:

這是一種低級趣味的插件,不建議使用。JAVA發展到今天,各類插件層出不窮,如何甄別各類插件的優劣?能從架構上優化你的設計的,能提升應用程序性能的 , 實現高度封裝可擴展的..., 像lombok這種,像這種插件,已經不只僅是插件了,改變了你如何編寫源碼,事實上,少去了代碼你寫上去又如何? 若是JAVA家族處處充斥這樣的東西,那隻不過是一坨披着金屬顏色的屎,早晚會被其它的語言取代。

雖然話糙但理確實不糙,試想一個項目有很是多相似Lombok這樣的插件,我的以爲真的會極大的下降閱讀源代碼的溫馨度。

雖然很是不建議在屬性的getter/setter寫一些業務代碼,但在多年項目的實戰中,有時經過給getter/setter加一點點業務代碼,能極大的簡化某些業務場景的代碼。所謂取捨,也許就是這時的捨棄必定的規範,取得極大的方便。

Lombok有它的得天獨厚的優勢,也有它避之不及的缺點,熟知其優缺點,在實戰中靈活運用纔是王道。

相關文章
相關標籤/搜索