? ? Lombok是一款通過注解在Java編譯期生成代碼的工具役衡,通過使用其內(nèi)置的一些注解如@Getter, @Setter等,可以在編譯期間生成getter,setter诵原,構造器风钻,builder等代碼顷蟀,效果如下:
????如圖,通過@Data注解骡技,lombok為MatchingCriteria類生成了Getter鸣个,Setter,hashcode布朦,equals等方法囤萤;通過@AllArgsConstructor注解為MatchingCriteria類生成了全參構造器,@NoArgsConstructor注解為MatchingCriteria類生成了無參構造器是趴。
1. Lombok原理
? ? Lombok通過添加注解的方式來生成代碼涛舍,在Jdk1.5引入注解的同時,也引入了兩種解析注解的方式:1. 運行時通過反射解析 2. 編譯時期解析
1.1 運行時解析注解
????運行時能夠解析的注解唆途,必須將@Retention設置為RUNTIME富雅,這樣可以通過反射獲得該注解。以下是常用的解析注解的api:
boolean isAnnotationPresent(Class annotationClass);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?T getAnnotation(Class annotationClass);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Annotation[] getAnnotations();?
1.2 編譯時解析注解
? ? 編譯時解析注解主要有兩種方式:Annotation Processing Tool以及Pluggable Annotation Processing API肛搬。
1.2.1 Annotation Processing Tool
? ? APT來自JDK5没佑, JDK7中不推薦使用,JDK8中已經(jīng)徹底刪除了滚婉。從JDK1.6以后图筹,可以使用Pluggable Annotation Processing API來代替它。APT被廢棄的主要原因如下:
1. APT集成在com.sun.mirror非標準包下
2. 沒有集成到javac中,需要額外運行
1.2.2?Pluggable Annotation Processing API
? ? JSR 269在JDK6中被引入远剩,作為APT的替代方案扣溺。javac執(zhí)行的時候會調(diào)用Pluggable Annotation Processing API,因此我們可以通過實現(xiàn)此API來改變編譯期的一些行為從而達到目的瓜晤。具體的編譯流程如下:
舉例來說锥余,現(xiàn)在有一個實現(xiàn)了Pluggable Annotation Processing API的程序A,那么使用javac編譯時的具體流程如下:
1. javac編譯器對源碼進行分析痢掠,生成一個抽象的語法樹(AST)
2. javac編譯器運行A程序
3. A程序完成邏輯驱犹,一般是修改此語法樹
4. javac使用修改后的語法樹生成可執(zhí)行的字節(jié)碼文件
Lomok便是通過Pluggable Annotation Processing API來實現(xiàn)代碼生成的黄刚。