今天看到有代碼中的Dao包中的類文件,寫的極其簡潔,甚至引發了開發工具InteliJ的報錯,而後程序還能穩健地跑起來。java
import lombok.Data;
@Data
public class VaildCode {
private String code;
private long expTime;
}
原來是這個類加了@Data註解,全部Java代碼中不須要生成getters and setters,而在編譯的時候會自動生成getters and setters工具
查看到pom.xml文件中,對應的依賴是開發工具
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
經常使用的註解以下==
lombok spa
工做的原理分析,以Oracle的javac編譯工具爲例。
自從Java 6起,javac就支持「JSR 269 Pluggable Annotation Processing API」規範,只要程序實現了該API,就能在javac運行的時候獲得調用。
舉例來講,如今有一個實現了」JSR 269 API」的程序A,那麼使用javac編譯源碼的時候具體流程以下:3d
javac對源代碼進行分析,生成一棵**抽象語法樹(AST) **
運行過程當中調用實現了」JSR 269 API」的A程序
此時A程序就能夠完成它本身的邏輯,包括修改第一步驟獲得的抽象語法樹(AST)
javac使用修改後的抽象語法樹(AST)生成字節碼文件code
因此lombok本質上就是這樣的一個實現了」JSR 269 API」的程序。在使用javac的過程當中,結合官方說明,它編譯的流程以下:xml
javac對源代碼進行分析,生成一棵**抽象語法樹(AST)****
運行過程當中調用實現了」JSR 269 API」的lombok程序
此時lombok就對第一步驟獲得的AST進行處理,找到@Data註解所在類對應的語法樹(AST),而後修改該語法樹(AST),增長getter和setter方法定義的相應樹節點
javac使用修改後的抽象語法樹(AST)生成字節碼文件blog
優勢:生命週期
能經過註解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提升了必定的開發效率
讓代碼變得簡潔,不用過多的去關注相應的方法
屬性作修改時,也簡化了維護爲這些屬性所生成的getter/setter方法等
缺點:
不支持多種參數構造器的重載
雖然省去了手動建立getter/setter方法的麻煩,但大大下降了源代碼的可讀性和完整性,下降了閱讀源代碼的溫馨度
lombok的實現:就是元註解出現後註解運行生命週期裏面的編譯週期,這個就是 JSR 269 Pluggable Annotation Processing API,就是源代碼在編譯成字節碼的時候修改了語法樹的節點規則進行了增強生成,
之後能夠更加快捷的敲代碼了。
知乎上對lombok插件得見解也兩極化,有人以爲簡化代碼,閱讀代碼更溫馨;也有人極其反對,
只能說愛用不用,不用別詆譭。別人用了至少你要看得懂。