什麼是Lombok
1、龍目島
2、印度尼西亞西努沙登加拉(Nusa Tenggara Barat)省島嶼
3、西龍目海峽面對巴厘島,東隔阿拉斯(Alas)海峽面松巴哇(Sumbawa)島,北瀕爪哇島,南臨印度洋。
官網對其的介紹:通過簡單註解來精簡程式碼達到消除冗長程式碼的目的
Lombok有什麼優點
1、提高編碼效率
2、使程式碼更簡潔
3、消除冗長程式碼
4、避免修改欄位名字時忘記修改方法名
5、提高下“逼格”
注:IDE上必須要支援Lombok,否則IDE會報錯
Lombok的實現原理
1、其開發是遵循JSR 269 Pluggable Annotation Processing API
2、而javac從java6開始支援“JSR 269 API”規範
3、即只要程式實現了該API,就能在javac執行的時候得到呼叫
4、Lombok實現了“JSR 269 API”,在編譯時,javac編譯原始碼的具體流程如下:
引入專案
在maven的pom配置檔案中引入
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
注:如果是IDEA需要安裝Lombok外掛、Eclipse則下載對應的jar
使用Lombok
@Data :生成對應Getter、Setter
@Getter
@Getter(AccessLevel.PROTECTED)-生成的Get的許可權是protected
@Setter
@Setter(AccessLevel.PROTECTED)
@NoArgsConstructor-無參構造器
@AllArgsConstructor-所有引數構造器
@ToString
@ToString(exclude = “column”)-排除
@EqualsAndHashCode
@EqualsAndHashCode(exclude = “column”)
@Slf4j(使用logback日誌框架)
@log4j(使用log4j日誌框架)
@ToString(exclude = {“column1”,”column2“})黑名單
@ToString(of = {“column1”,“column2”})白名單
EqualsAndHashCode同上
@Data包含了(@Getter、@Setter、@ToString、@EqualsAndHashCode)
以上是大致的一些使用方式,讓我們通過反編譯來了解Lombok的實現。
反編譯瞭解Lombok
Java Decompiler大家可以在這個網站下載JD-GUI,一個便捷的反編譯工具。
我們通過Java Decompiler驗證 Clas檔案
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(exclude = "name")
@ToString(of = "password")
public class Person implements Serializable{
private static final long serialVersionUID = 5965420331615591278L;
private Integer id;
private String name;
private String password;
}
@Slf4j
public class PersonServiceImpl {
public Person findOne(){
log.info("findOne success");
return new Person();
}
}
我在一個pojo物件中注入了Lombok的註解,並保持這樣的原始碼,還有模擬的Service層使用log註解,接下來我們編譯一下專案,看看對應生成的class檔案是怎麼樣的。
這裡我們可以看到,編譯出來的class檔案與原始碼是不一樣的,Lombok幫我們進行了改變。
package com.example.lombok.pojo;
import java.io.Serializable;
public class Person
implements Serializable
{
private static final long serialVersionUID = 5965420331615591278L;
private Integer id;
private String name;
private String password;
public void setId(Integer id)
{
this.id = id;
}
public void setName(String name)
{
this.name = name;
}
public void setPassword(String password)
{
this.password = password;
}
public Person(Integer id, String name, String password)
{
this.id = id;this.name = name;this.password = password;
}
public boolean equals(Object o)
{
if (o == this) {
return true;
}
if (!(o instanceof Person)) {
return false;
}
Person other = (Person)o;
if (!other.canEqual(this)) {
return false;
}
Object this$id = getId();Object other$id = other.getId();
if (this$id == null ? other$id != null : !this$id.equals(other$id)) {
return false;
}
Object this$password = getPassword();Object other$password = other.getPassword();return this$password == null ? other$password == null : this$password.equals(other$password);
}
protected boolean canEqual(Object other)
{
return other instanceof Person;
}
public int hashCode()
{
int PRIME = 59;int result = 1;Object $id = getId();result = result * 59 + ($id == null ? 43 : $id.hashCode());Object $password = getPassword();result = result * 59 + ($password == null ? 43 : $password.hashCode());return result;
}
public String toString()
{
return "Person(password=" + getPassword() + ")";
}
public Integer getId()
{
return this.id;
}
public String getName()
{
return this.name;
}
public String getPassword()
{
return this.password;
}
public Person() {}
}
package com.example.lombok.service;
import com.example.lombok.pojo.Person;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PersonServiceImpl
{
private static final Logger log = LoggerFactory.getLogger(PersonServiceImpl.class);
public Person findOne()
{
log.info("findOne success");
return new Person();
}
}
如果本對你有幫助,歡迎關注本人技術公眾號,或者點贊,謝謝。