简介

lombok 是一个编译级别的插件,它能够在我的项目编译的时候生成一些代码。lombok 提供了一些注解,能够在类、字段、办法上应用,这些注解能够缩小一些代码的编写。

装置

在 IDEA 开发工具中,关上file -> Settings -> Plugins 搜寻 lombok 插件装置即可,如图界面:

我的项目中减少 lombok 的依赖,就能够应用 lombok 注解了,依赖如下:

<dependency>    <groupId>org.projectlombok</groupId>    <artifactId>lombok</artifactId>    <version>1.18.24</version></dependency>

注解

@Getter/@Setter

主动生成 getter 和 setter办法,作用在类或者字段上。

@Target({ElementType.FIELD, ElementType.TYPE})

@AllArgsConstructor

主动生成全参构造函数,如果 staticName 不为空的话,生成一个静态方法返回实例,并把结构器设置为 private。该注解作用在类上。

@AllArgsConstructor(staticName = "create")public class Example {   private int foo;   private final String bar;}

生成

public class Example {   private int foo;   private final String bar;   private Example(int foo, String bar) {       this.foo = foo;       this.bar = bar;   }   public static Example create(int foo, String bar) {       return new Example(foo, bar);   }}

@Builder

主动生成建造者模式的 bean。该注解作用在类、办法和结构器上。

@Builderpublic class Person {    private String name;    private Integer age;}

生成

public class Person {    private String name;    private Integer age;    Person(String name, Integer age) {        this.name = name;        this.age = age;    }    public static Person.PersonBuilder builder() {        return new Person.PersonBuilder();    }    public static class PersonBuilder {        private String name;        private Integer age;        PersonBuilder() {        }        public Person.PersonBuilder name(String name) {            this.name = name;            return this;        }        public Person.PersonBuilder age(Integer age) {            this.age = age;            return this;        }        public Person build() {            return new Person(this.name, this.age);        }        public String toString() {            return "Person.PersonBuilder(name=" + this.name + ", age=" + this.age + ")";        }    }}

@Data

生成所有字段的 getter、toString()、hashCode()、equals()、所有非 final 字段的setter、结构器。该注解作用在类上。

@Datapublic class Example {   private int foo;   private final String bar;}

生成

public class Example {   private int foo;   private final String bar;   public Example(String bar) {       this.bar = bar;   }   public int getFoo() {       return this.foo;   }   public String getBar() {       return this.bar;   }   public void setFoo(int foo) {       this.foo = foo;   }   public boolean equals(Object o) {       if (o == this) {           return true;       } else if (!(o instanceof Example)) {           return false;       } else {           Example other = (Example)o;           if (!other.canEqual(this)) {               return false;           } else if (this.getFoo() != other.getFoo()) {               return false;           } else {               Object this$bar = this.getBar();               Object other$bar = other.getBar();               if (this$bar == null) {                   if (other$bar != null) {                       return false;                   }               } else if (!this$bar.equals(other$bar)) {                   return false;               }               return true;           }       }   }   protected boolean canEqual(Object other) {       return other instanceof Example;   }   public int hashCode() {       int PRIME = true;       int result = 1;       int result = result * 59 + this.getFoo();       Object $bar = this.getBar();       result = result * 59 + ($bar == null ? 43 : $bar.hashCode());       return result;   }   public String toString() {       return "Example(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")";   }}

@Slf4j

主动生成 slf4j 的 final static log 变量,该注解作用在类上。

原理

编译期操作

比方:@Data 注解,@Retention(RetentionPolicy.SOURCE) ,这个的意思是,注解保留的工夫是在源码期间,编译实现后该注解就会删除,在删除之前,编译器会为其增加一些办法等等操作,即在编译期为代码进行了加强。

JSR-269提案

JDK6 提出并通过了 JSR-269 提案,提案通过了一组被称为“插入式注解处理器”的规范 API,能够提前至编译期对代码中的特定注解进行解决,从而影响到编译器的工作过程。

Lombok实质

一个实现了 “JSR 269 API” 的程序。在应用 javac 的过程中,它产生作用的具体流程如下:

  • javac 对源代码进行词法,语法分析,生成了一棵形象语法树 AST(Abstract syntax tree)
  • 运行过程中调用注解处理器,即实现了 “JSR 269 API” 的 Lombok 程序
  • Lombok 对第一步骤生成的 AST 进行解决,找到 @Data 注解所在类对应的语法树(AST),而后批改该语法树(AST),减少 getter 和 setter 等办法定义的相应树节点
  • javac 应用批改后的形象语法树(AST)生成字节码文件,即给 class 减少新的节点(代码块)

总结

lombok 这种插件,在编译器编译时通过操作 AST(形象语法树)扭转字节码,在源代码的根底上进行代码加强,它扭转了编写源码的形式,肯定水平上加重了源代码的编写量,对开发效率有肯定的晋升。

lombok 注解的应用暗藏了一些代码细节,可能会对代码的调试带来一些影响,当我的项目中应用了大量的 lombok 注解,前期代码的保护可能也会或多或少有一些影响。