前言:
当前我们对“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简化代码