简介

lombok是一个编译级别的插件,它可以在项目编译的时候生成一些代码。通俗的说,lombok可以通过注解来标示生成getter settter等代码。

引入

创建gradle项目

compile group: 'org.projectlombok', name: 'lombok', version: '1.16.20'

注解

@NonNull

标记字段不可为null

@Setter
public class Person {
@NonNull
private String name;
@NonNull
private Integer age;
}

对应的字节码文件:

public class Person {
@NonNull
private String name;
@NonNull
private Integer age; public Person() {
} public void setName(@NonNull String name) {
if (name == null) {
throw new NullPointerException("name");
} else {
this.name = name;
}
} public void setAge(@NonNull Integer age) {
if (age == null) {
throw new NullPointerException("age");
} else {
this.age = age;
}
}
}

@Getter/@Setter

自动生成getter和setter方法

public class Person {
@Getter
private String name;
@Setter
private Integer age;
}

对应的字节码文件:

public class Person {
private String name;
private Integer age; public Person() {
} public String getName() {
return this.name;
} public void setAge(Integer age) {
this.age = age;
}
}

@Cleanup

自动关闭流代码

@Cleanup
InputStream in = new FileInputStream(args[0]);

对应的字节码文件:

InputStream in = new FileInputStream(args[0]);
if (Collections.singletonList(in).get(0) != null) {
in.close();
}

@AllArgsConstructor/@NoArgsConstructor/@RequiredArgsConstructor

自动生成全参构造函数和无参构造函数

@AllArgsConstructor
@NoArgsConstructor
public class Person {
private String name;
private Integer age;
}

对应的字节码文件

public class Person {
private String name;
private Integer age; public Person(String name, Integer age) {
this.name = name;
this.age = age;
} public Person() {
}
}

@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 + ")";
}
}
}

@EqualsAndHashCode

自动生成equals和hashcode方法

@EqualsAndHashCode
public class Person {
private String name;
private Integer age;
}

对应的字节码文件

public class Person {
private String name;
private Integer age; public Person() {
} public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Person)) {
return false;
} else {
Person other = (Person)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$name = this.name;
Object other$name = other.name;
if (this$name == null) {
if (other$name != null) {
return false;
}
} else if (!this$name.equals(other$name)) {
return false;
} Object this$age = this.age;
Object other$age = other.age;
if (this$age == null) {
if (other$age != null) {
return false;
}
} else if (!this$age.equals(other$age)) {
return false;
} return true;
}
}
} protected boolean canEqual(Object other) {
return other instanceof Person;
} public int hashCode() {
int PRIME = true;
int result = 1;
Object $name = this.name;
int result = result * 59 + ($name == null ? 43 : $name.hashCode());
Object $age = this.age;
result = result * 59 + ($age == null ? 43 : $age.hashCode());
return result;
}
}

@ToString

自动生成toString()方法

@ToString
public class Person {
private String name;
private Integer age;
}

对应的字节码文件

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

@Value

自动生成全参构造函数、Getter方法、equals方法、hashCode法、toString方法

@Value
public class Person {
private String name;
private Integer age;
}

注意:@Value不会生成Setter方法

@Synchronized

自动为被标记的方法添加synchronized锁

public class SynchronizedExample {
private final Object readLock = new Object(); @Synchronized
public static void hello() {
System.out.println("world");
} @Synchronized
public int answerToLife() {
return 42;
} @Synchronized("readLock")
public void foo() {
System.out.println("bar");
}
}

对应的字节码文件

public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object $lock = new Object[0];
private final Object readLock = new Object(); public static void hello() {
synchronized($LOCK) {
System.out.println("world");
}
} public int answerToLife() {
synchronized($lock) {
return 42;
}
} public void foo() {
synchronized(readLock) {
System.out.println("bar");
}
}
}

@Delegate

为标记属性生成委托方法

public class DelegateExample {
public void show() {
System.out.println("show...");
}
}
@AllArgsConstructor
public class Demo {
@Delegate
private final DelegateExample delegateExample;
}

对应的字节码文件

public class DelegateExample {
public DelegateExample() {
} public void show() {
System.out.println("show...");
}
}
public class Demo {
private final DelegateExample delegateExample; public Demo(DelegateExample delegateExample) {
this.delegateExample = delegateExample;
} // 委托方法
public void show() {
this.delegateExample.show();
}
}

最新文章

  1. windows2003批量添加和导出所有ip
  2. html5 表单样式 表单验证1 2 3
  3. 【五】PHP数组操作函数
  4. POJ 1573 Robot Motion
  5. HDU4907——Task schedule(BestCoder Round #3)
  6. c++重载与覆写
  7. JQ 遍历节点
  8. cocos2d-x 2.2.6中c++通过JNI与java互调
  9. HDU 2665(Kth number-区间第k大[内存限制+重数])
  10. spring security 跨域防伪攻击
  11. Django学习-5-模板渲染
  12. Cocos2D瓦块地图高清屏(retina)显示比例问题的解决
  13. DAY18、常用模块
  14. Go+Python双剑合璧
  15. navicat primium 快捷键与命令
  16. C# WebApi+Task+WebSocket实战项目演练(四)
  17. CF 468B Two Sets
  18. qt中QtreeWidget与QstackWidget关联的问题
  19. 【转】JavaScript数组方法大全
  20. DLL的晚绑定与早绑定

热门文章

  1. 剑指offer刷题笔记
  2. 使用logstash结合logback收集微服务日志
  3. 题解【RQNOJ PID497 0/1字串问题】
  4. 题解 bzoj1954【Pku3764 The xor – longest Path】
  5. 【阿里云IoT+YF3300】14.阿里IoT Studio打造手机端APP
  6. 根据navigator.userAgent返回值识别 浏览器
  7. WARNING OGG-00706 Failed to add supplemental log group on table
  8. 【TensorFlow】TensorFlow获取Variable值,将Variable保存为list数据
  9. PBFT算法java实现
  10. golang的timer一些坑