Idea使用Lombok简化实体类代码
引入相應的maven包
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.18</version><scope>provided</scope> </dependency>Lombok的scope=provided,說明它只在編譯階段生效,不需要打入包中。事實正是如此,Lombok在編譯期將帶Lombok注解的Java文件正確編譯為完整的Class文件。
IDEA添加對Lombok的支持
?點擊File-- Settings設置界面,安裝Lombok插件
點擊File-- Settings設置界面,開啟Annocation Processors
開啟該項是為了讓Lombok注解在編譯階段起到作用。
?Eclipse的Lombok插件安裝可以自行百度,也比較簡單,最好在官方下載最新版,網上有些版本可能會導致eclipse出現莫名其妙錯誤。
?Lombok實現原理
自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規范,只要程序實現了該API,就能在javac運行的時候得到調用。
Lombok就是一個實現了"JSR 269 API"的程序。在使用javac的過程中,它產生作用的具體流程如下:
javac對源代碼進行分析,生成一棵抽象語法樹(AST)
javac編譯過程中調用實現了JSR 269的Lombok程序
此時Lombok就對第一步驟得到的AST進行處理,找到Lombok注解所在類對應的語法樹(AST),然后修改該語法樹(AST),增加Lombok注解定義的相應樹節點
javac使用修改后的抽象語法樹(AST)生成字節碼文件
?Lombok注解的使用
?POJO類常用注解:
@Getter/@Setter: 作用類上,生成所有成員變量的getter/setter方法;作用于成員變量上,生成該成員變量的getter/setter方法??梢栽O定訪問權限及是否懶加載等。
1 package com.trace; 2 3 import lombok.AccessLevel; 4 import lombok.Getter; 5 import lombok.Setter; 6 7 /** 8 * Created by Trace on 2018/5/19.<br/> 9 * DESC: 測試類 10 */ 11 @SuppressWarnings("unused") 12 public class TestClass { 13 14 public static void main(String[] args) { 15 16 } 17 18 19 @Getter(value = AccessLevel.PUBLIC) 20 @Setter(value = AccessLevel.PUBLIC) 21 public static class Person { 22 private String name; 23 private int age; 24 private boolean friendly; 25 } 26 27 28 public static class Animal { 29 private String name; 30 private int age; 31 @Getter @Setter private boolean funny; 32 } 33 34 }在Structure視圖中,可以看到已經生成了getter/setter等方法
?
編譯后的代碼如下:[這也是傳統Java編程需要編寫的樣板代碼]
1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package com.trace; 7 8 public class TestClass { 9 public TestClass() { 10 } 11 12 public static void main(String[] args) { 13 } 14 15 public static class Animal { 16 private String name; 17 private int age; 18 private boolean funny; 19 20 public Animal() { 21 } 22 23 public boolean isFunny() { 24 return this.funny; 25 } 26 27 public void setFunny(boolean funny) { 28 this.funny = funny; 29 } 30 } 31 32 public static class Person { 33 private String name; 34 private int age; 35 private boolean friendly; 36 37 public Person() { 38 } 39 40 public String getName() { 41 return this.name; 42 } 43 44 public int getAge() { 45 return this.age; 46 } 47 48 public boolean isFriendly() { 49 return this.friendly; 50 } 51 52 public void setName(String name) { 53 this.name = name; 54 } 55 56 public void setAge(int age) { 57 this.age = age; 58 } 59 60 public void setFriendly(boolean friendly) { 61 this.friendly = friendly; 62 } 63 } 64 }@ToString:作用于類,覆蓋默認的toString()方法,可以通過of屬性限定顯示某些字段,通過exclude屬性排除某些字段。
@EqualsAndHashCode:作用于類,覆蓋默認的equals和hashCode
@NonNull:主要作用于成員變量和參數中,標識不能為空,否則拋出空指針異常。
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于類上,用于生成構造函數。有staticName、access等屬性。
staticName屬性一旦設定,將采用靜態方法的方式生成實例,access屬性可以限定訪問權限。
@NoArgsConstructor:生成無參構造器;
@RequiredArgsConstructor:生成包含final和@NonNull注解的成員變量的構造器;
@AllArgsConstructor:生成全參構造器。
編譯后結果
1 public static class Person { 2 @NonNull 3 private String name; 4 private int age; 5 private boolean friendly; 6 7 public String toString() { 8 return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")"; 9 } 10 11 @NonNull 12 public String getName() { 13 return this.name; 14 } 15 16 public int getAge() { 17 return this.age; 18 } 19 20 public boolean isFriendly() { 21 return this.friendly; 22 } 23 24 public void setName(@NonNull String name) { 25 if(name == null) { 26 throw new NullPointerException("name"); 27 } else { 28 this.name = name; 29 } 30 } 31 32 public void setAge(int age) { 33 this.age = age; 34 } 35 36 public void setFriendly(boolean friendly) { 37 this.friendly = friendly; 38 } 39 40 private Person() { 41 } 42 43 private static TestClass.Person of() { 44 return new TestClass.Person(); 45 } 46 47 @ConstructorProperties({"name"}) 48 Person(@NonNull String name) { 49 if(name == null) { 50 throw new NullPointerException("name"); 51 } else { 52 this.name = name; 53 } 54 } 55 56 @ConstructorProperties({"name", "age", "friendly"}) 57 public Person(@NonNull String name, int age, boolean friendly) { 58 if(name == null) { 59 throw new NullPointerException("name"); 60 } else { 61 this.name = name; 62 this.age = age; 63 this.friendly = friendly; 64 } 65 } 66 }?
@Data:作用于類上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
@Builder:作用于類上,將類轉變為建造者模式
@Log:作用于類上,生成日志變量。針對不同的日志實現產品,有不同的注解
?
其他重要注解:
@Cleanup:自動關閉資源,針對實現了java.io.Closeable接口的對象有效,如:典型的IO流對象
?
編譯后結果如下:
?
@SneakyThrows:可以對受檢異常進行捕捉并拋出,可以改寫上述的main方法如下
?
@Synchronized:作用于方法級別,可以替換synchronize關鍵字或lock鎖,用處不大
原文作者:LiWenD正在掘金
原文地址:https://juejin.im/post/5b00517cf265da0ba0636d4b
轉載于:https://www.cnblogs.com/yanglei-xyz/p/idea_lombok.html
總結
以上是生活随笔為你收集整理的Idea使用Lombok简化实体类代码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【团队】 冲刺一(9/10)
- 下一篇: CSS图形每日一练(下)