文章目录
1. Lombok 是什么
-
官网:https://projectlombok.org/
-
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.
-
白话:Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 中的冗长代码,尤其是对于简单的
Java 对象(POJO)
,它通过注解实现这一目的。 -
简化
JavaBean
开发
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
- idea中搜索安装
lombok
插件
- Lombok
@Data
注解 - 按快捷键
Alt+7
就能显示当前类中的所有方法、全局常量,方法还包括形参和返回值 - 或 view—>Tool Windows —>Structure—>点击
2. Lombok原理
- JSR 269:插件化注解处理API(Pluggable Annotation Processing API)
- 官网: https://www.jcp.org/en/jsr/detail?id=269
JDK6提供的特性,在 Javac编译期利用注解
- 查看编译后的
User.class
- 原理实现流程图
3. Lombok 常用注解
1. @Getter 和 @Setter 方法
-
测试
@Setter
注解
User.java
User.class
-
测试
@Getter(AccessLevel.PROTECTED)
注解,默认是public
,可以设置不同方法的级别
-
给所有变量添加set、get方法,直接在类中注解
-
注意:
- lombok不会对 static 修饰的变量产生set、get方法
- lombok对 final 修饰的字符不会产生 set 方法
-
自定义变量不生成 set、get方法
2. @ToString 方法
- 自定义排除某些字段的ToString 方法
3. @EqualsAndHashCode
- 自定义排除某些字段的 EqualsAndHashCode方法
4. @NonNull
- 作用:注解的作用就是在方法中做了一次不为空的判断
- 案例:
public void test(@NonNull String s){
System.out.println(s);
}
public static void main(String[] args) {
User user = new User();
user.test(null);
}
- 结果:空指针
- 查看编译后的源代码:
public void test(@NonNull String s) {
if (s == null) {
throw new NullPointerException("s is marked non-null but is null");
} else {
System.out.println(s);
}
}
- 也可以使用在构造函数里,也可以在字段中添加注解
@NotNull private Integer id;
5. @NoArgsConstructor 和 @RequiredArgsConstructor、 @AllArgsConstructor
-
@NoArgsConstructor,添加无参构造方法
-
@RequiredArgsConstructor,指定部分有参构造,默认会找标识了
@NonNull
的变量添加构造方法,或标识了final
修饰的变量且没有赋予初始值添加构造方法
-
@AllArgsConstructor,生成所有成员变量的构造方法
6. @Data
- 作用于类上,是以下注解的集合:@ToString ,@EqualsAndHashCode ,@Getter, @Setter @RequiredArgsConstructor
7. @Builder
- 以字段名为方法名构造一系列的方法,而且方法返回的对象是UserBuilder
8. @Log
- @Log:作用于类上,生成日志变量。针对不同的日志实现,有不同的注解:
9. val
HashMap<String,String> map = new HashMap<String,String>();
简化的写法
val map = new HashMap<String,String>();
public static void main(String[] args) {
val sets = new HashSet<String>();
val lists = new ArrayList<String>();
val maps = new HashMap<String, String>();
//=>相当于如下
final Set<String> sets2 = new HashSet<>();
final List<String> lists2 = new ArrayList<>();
final Map<String, String> maps2 = new HashMap<>();
}
10. @Cleanup
- 用于关闭并释放资源,可以用在 IO 流上;
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);
}
}
}
- 上面相当与如下传统的 Java 代码:
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
}