Lombok學習總結
Lombok介紹及優點
什麼是lombok
Lombok(lombok官網)項目是一個Java庫,它會自動插入編輯器和構建工具中,Lombok提供了一組有用的註釋,用來消除Java類中的大量樣板代碼。僅五個字符(@Data)就可以替換數百行代碼從而產生乾淨,簡潔且易於維護的Java類。
lombok的優點
1.提高編碼系效率
2.使代碼更簡潔
3.消除冗餘代碼
4.避免修改字段名時忘記修改方法名
5.生成日誌變量
Lombok原理
1.javac從java6開始支持“JSR 269 API”規範
2.只要程序實現該API,就能在javac運行的時候得到調用
3.Lombok也實現了"JSR 269 API"
在編譯時,javac編譯源碼的具體流程如下:
1.javac對源代碼分析 =>
2.生成抽象語法樹AST =>
3.調用實現了"JSR 269 API"規範的Lombok程序(lombok Annotation Processor) =>
4.lombok程序對AST進行處理, =>
5.lombok Annotation Handler 找到lombok相應註解對應語法樹=>
6.然後修改該語法樹,拿到修改後的語法樹進行解析和生成=>
7.得到字節碼文件
Lombok引入項目
maven引入lombok
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<scope>provided</scope> 加不加無所謂,加上表示編譯時不會打進War中
IDEA/Eclipse安裝 Lombok插件
IDEA
file => settings=> plugins搜索lombok安裝即可
Eclipse
官網有各種IDES的安裝方法官網下載
下載Jar後雙擊安裝即可
若安裝失敗權限不夠:
1.Windows下右鍵管理員打開lombok.jar
2.Mac/Linux 打開控制檯進入jar目錄執行 sudo java -jar lombok.jar
Lombok註解介紹
@Setter :註解在類或字段,註解在類時爲所有字段生成setter方法,註解在字段上時只爲該字段生成setter方法。
@Setter (AccessLevel.PRIVATE) :生成私有方法
@Getter :使用方法同上,區別在於生成的是getter方法。
@Getter(AccessLevel.PRIVATE) :生成私有方法
@ToString :註解在類,添加toString方法。
@ToString (exclude="column"): 生成toString時排除某個字段
@ToString (exclude="{column1,column2}"): 生成toString時排除多個字段
@ToString (of="column"): 生成toString時指定某個字段
@ToString (of="{column1,column2}"): 生成toString時指定多個字段
@EqualsAndHashCode: 註解在類,生成hashCode和equals方法。
@EqualsAndHashCode(exclude="column") : 排除某個屬性不參與equals和hashCode
@EqualsAndHashCode(of="column")
@EqualsAndHashCode(exclude="{column1,column2}")
@EqualsAndHashCode(of="{column1,column2}")
@NoArgsConstructor: 註解在類,生成無參的構造方法。
@RequiredArgsConstructor: 註解在類,爲類中需要特殊處理的字段生成構造方法,比如final和被@NonNull註解的字段。
@AllArgsConstructor: 註解在類,生成包含類中所有字段的構造方法。
@Data: 註解在類,生成setter/getter、equals、canEqual、hashCode、toString方法,如爲final屬性,則不會爲該屬性生成setter方法。
@Data包含: @Getter @Setter @ToString @EqualsAndHashCode
@Slf4j: 註解在類,生成log變量,嚴格意義來說是常量。
@Slf4j: 使用logback日誌框架時使用@slf4j
@Log4j: 使用log4j日誌框架時使用@Log4j
反編譯驗證Lombok生成的代碼
編寫類,生成getter setter 有參/無參 toString排除rcode屬性:
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@ToString(exclude = "rcode")
public class Role implements Serializable {
private static final long serialVersionUID = -4604675020932688771L;
private Integer id;
private String rname;
private String rcode;
private Set<User> users;
private Set<Permission> permissions;
}
使用反編譯工具打開該字節碼文件:
public class Role implements Serializable {
private static final long serialVersionUID = -4604675020932688771L;
private Integer id;
private String rname;
private String rcode;
private Set<User> users;
private Set<Permission> permissions;
public void setId(Integer id) {
this.id = id;
}
public void setRname(String rname) {
this.rname = rname;
}
public void setRcode(String rcode) {
this.rcode = rcode;
}
public void setUsers(Set<User> users) {
this.users = users;
}
public void setPermissions(Set<Permission> permissions) {
this.permissions = permissions;
}
public Integer getId() {
return this.id;
}
public String getRname() {
return this.rname;
}
public String getRcode() {
return this.rcode;
}
public Set<User> getUsers() {
return this.users;
}
public Set<Permission> getPermissions() {
return this.permissions;
}
}
public Role() {}
public Role(Integer id, String rname, String rcode, Set<User> users, Set<Permission> permissions) {
this.id = id;
this.rname = rname;
this.rcode = rcode;
this.users = users;
this.permissions = permissions;
}
public String toString() {
return "Role(id=" + getId() + ", rname=" + getRname() + ",
users=" + getUsers() + ", permissions=" + getPermissions() + ")";
}