Lombok框架集成与原理解析

Lombok框架集成与原理解析
什么是Lombok

1、龙目岛
2、印度尼西亚西努沙登加拉(Nusa Tenggara Barat)省岛屿
3、西龙目海峡面对巴厘岛,东隔阿拉斯(Alas)海峡面松巴哇(Sumbawa)岛,北濒爪哇岛,南临印度洋。

官网对其的介绍:通过简单注解来精简代码达到消除冗长代码的目的

Lombok框架集成与原理解析
Lombok有什么优点

1、提高编码效率
2、使代码更简洁
3、消除冗长代码
4、避免修改字段名字时忘记修改方法名
5、提高下“逼格”
注:IDE上必须要支持Lombok,否则IDE会报错

Lombok框架集成与原理解析
Lombok的实现原理

1、其开发是遵循JSR 269 Pluggable Annotation Processing API
2、而javac从java6开始支持“JSR 269 API”规范
3、即只要程序实现了该API,就能在javac运行的时候得到调用
4、Lombok实现了“JSR 269 API”,在编译时,javac编译源码的具体流程如下:

Lombok框架集成与原理解析

Lombok框架集成与原理解析
引入项目

在maven的pom配置文件中引入


注:如果是IDEA需要安装Lombok插件、Eclipse则下载对应的jar
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
    <scope>provided</scope>
</dependency>

Lombok框架集成与原理解析
使用Lombok

@Data :生成对应Getter、Setterbr/>@Getter
@Getter(AccessLevel.PROTECTED)-生成的Get的权限是protected
br/>@Setter
@Setter(AccessLevel.PROTECTED)
br/>@NoArgsConstructor-无参构造器
@AllArgsConstructor-所有参数构造器
br/>@ToString
@ToString(exclude = “column”)-排除
br/>@EqualsAndHashCode
@EqualsAndHashCode(exclude = “column”)
br/>@Slf4j(使用logback日志框架)
@log4j(使用log4j日志框架)
@ToString(exclude = {“column1”,”column2“})黑名单
@ToString(of = {“column1”,“column2”})白名单
EqualsAndHashCode同上
@Data包含了(@Getter、@Setter、@ToString、@EqualsAndHashCode)

以上是大致的一些使用方式,让我们通过反编译来了解Lombok的实现。

Lombok框架集成与原理解析
反编译了解Lombok

Java Decompiler大家可以在这个网站下载JD-GUI,一个便捷的反编译工具。
我们通过Java Decompiler验证 Clas文件

@Databr/>@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();
}
}
Lombok框架集成与原理解析
我在一个pojo对象中注入了Lombok的注解,并保持这样的源码,还有模拟的Service层使用log注解,接下来我们编译一下项目,看看对应生成的class文件是怎么样的。

Lombok框架集成与原理解析

这里我们可以看到,编译出来的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();
  }
}
上一篇:lombok的使用


下一篇:[Java工具] Lombok基本安装&使用