Lombok使用与介绍

简介

lombok 是一个编译级别的插件,它可以在项目编译的时候生成一些代码。lombok 提供了一些注解,可以在类、字段、方法上使用,这些注解可以减少一些代码的编写。

安装

在 IDEA 开发工具中,打开file -> Settings -> Plugins 搜索 lombok 插件安装即可,如图界面:
Lombok使用与介绍_第1张图片

项目中增加 lombok 的依赖,就可以使用 lombok 注解了,依赖如下:


    org.projectlombok
    lombok
    1.18.24

注解

@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。该注解作用在类、方法和构造器上。

@Builder
public 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、构造器。该注解作用在类上。

@Data
public 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) ,这个的意思是,注解保留的时间是在源码期间,编译完成后该注解就会删除,在删除之前,编译器会为其添加一些方法等等操作,即在编译期为代码进行了增强。

Lombok使用与介绍_第2张图片

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 注解,后期代码的维护可能也会或多或少有一些影响。

你可能感兴趣的:(javalombok)