龙空技术网

Lombok简化你的JAVA编码方式

JAVA油腻男 227

前言:

当前我们对“java简化代码”大约比较讲究,看官们都想要学习一些“java简化代码”的相关文章。那么小编也在网摘上搜集了一些对于“java简化代码””的相关内容,希望姐妹们能喜欢,咱们一起来学习一下吧!

《五分钟学技术》系列每日更新,关注我带你每天都进步一点!

Lombok简介

Lombok是一个可以通过简单的注解来帮助我们简化Java代码的工具,通过使用对应的注解,可以在编译期自动生成我们需要的内容。

官方地址:

github地址:

Lombok工作原理

在Lombok使用的过程中,只要添加相应的注解即可自动生成所需的代码,它到底是如何实现的呢?

核心之处在于注解上。JDK5引入的注解提供了两种解析方式。

运行时解析

运行时能够解析的注解,必须将@Retention设置为RUNTIME,这样就可以通过反射拿到该注解。在运行期,Class、Constructor、Field、Method、Package等都可以通过反射的方式获取。

编译时解析

JSR 269自JDK6加入,javac在执行的时候会调用实现了该API的程序,这样我们就可以对编译器做一些增强,这时javac执行的过程如下:

Lombok本质上就是一个实现了“JSR 269 API”的程序。在使用javac的过程中,它产生作用的具体流程如下:

javac对源代码进行分析,生成了一棵抽象语法树(AST)运行过程中调用实现了“JSR 269 API”的Lombok程序此时Lombok就对第一步骤得到的AST进行处理,找到@Data注解所在类对应的语法树(AST),然后修改该语法树(AST),增加getter和setter方法定义的相应树节点javac使用修改后的抽象语法树(AST)生成字节码文件,即给class增加新的节点(代码块)Lombok使用

引入对应的依赖

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

@Data

@Data注解在类上,会为类的所有属性自动生成setter/getter、equals、hashCode、toString方法,如

加上final,则不会为该属性生成setter方法。

@Data public class DataExample {  private final String name;    @Data(staticConstructor="of")  public static class Exercise<T> {    private final String name;    private final T value;  }}

@Getter/@Setter

如果只想为某个属性增加对应方法,可以使用@Getter/@Setter注解

public class GetterSetterExample {  @Getter @Setter private int age = 10;    @Setter(AccessLevel.PROTECTED) private String name;}

@NonNull

该注解用在属性或构造器上,Lombok会生成一个非空的声明,可用于校验参数,避免空指针。

public class NonNullExample extends Something {  private String name;    public NonNullExample(@NonNull Person person) {    super("Hello");    this.name = person.getName();  }}

@Cleanup

该注解能帮助我们自动调用close()方法,很大的简化了代码。

public class CleanupExample {  public static void main(String[] args) throws IOException {    @Cleanup InputStream in = new FileInputStream(args[0]);    @Cleanup OutputStream out = new FileOutputStream(args[1]);    byte[] b = new byte[10000];    while (true) {      int r = in.read(b);      if (r == -1) break;      out.write(b, 0, r);    }  }}

@EqualsAndHashCode

默认情况下,会使用所有非静态(non-static)和非瞬态(non-transient)属性来生成equals和hasCode

@EqualsAndHashCode(exclude={"id", "shape"})public class EqualsAndHashCodeExample {  private transient int transientVar = 10;  private String name;  private double score;  private Shape shape = new Square(5, 10);  private String[] tags;  private int id;    public String getName() {    return this.name;  }  }

@ToString

类使用@ToString注解,Lombok会生成一个toString()方法,默认情况下,会输出类名、所有属性。

@ToString(exclude="id")public class ToStringExample {  private static final int STATIC_VAR = 10;  private String name;  private Shape shape = new Square(5, 10);  private String[] tags;  private int id;    public String getName() {    return this.getName();  }}

@NoArgsConstructor, @RequiredArgsConstructor and @AllArgsConstructor

无参构造器、部分参数构造器、全参构造器。Lombok没法实现多种参数构造器的重载。

@RequiredArgsConstructor(staticName = "of")@AllArgsConstructor(access = AccessLevel.PROTECTED)public class ConstructorExample<T> {  private int x, y;  @NonNull private T description;    @NoArgsConstructor  public static class NoArgsExample {    @NonNull private String field;  }}

标签: #java简化代码