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() + ")"; 	
	     }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章