常用注解
Lombok常用的注解有:
- @Data :相当于@Setter + Getter + @ToString + @EqualsAndHashCode
- @Setter @Getter:作用于属性上,自动生成getter和setter方法
- @NonNull:判断是否为空,如果为空,则抛出java.lang.NullPointerException
- @Synchronized:作用在方法上,自动添加到同步机制,生成的代码并不是直接锁方法而是锁代码块
- @ToString:生成toString()方法,该注解有以下多个属性可以进一步设置:
- callSuper:是否输出父类的toString方法,默认为false
- includeFieldNames:是否包含字段名称,默认为true
- exclude:排除生成tostring的字段
- @EqualsAndHashCode
- @Cleanup:用于确保已分配的资源被释放,自动帮我们调用close()方法。比如IO的连接关闭。
- @SneakyThrows
- @NoArgsConstructor:自动生成无参数构造函数。
- @AllArgsConstructor:自动生成全参数构造函数。
- @Builder
- @SuperBuilder
示例
@Getter/@Setter
为字段生成Getter和Setter方法,可以注解到字段或者类上(注解在类上会为类中的所有字段生成Getter和Setter方法),默认是public类型的,如果需要的话可以修改方法的访问级别。
示例一:
- 源代码
public class Emp {
@Getter
private Integer empno;
@Getter(AccessLevel.PROTECTED)
private String ename;
@Setter(AccessLevel.PRIVATE)
private String job;
@Getter
@Setter
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public Integer getEmpno() {
return this.empno;
}
protected String getEname() {
return this.ename;
}
private void setJob(String job) {
this.job = job;
}
public Integer getMgr() {
return this.mgr;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
}
注意:Lombok中的注解一般都会包含一个无参构造函数注解@NoArgsConstructor(用于生成无参构造函数的) ,所以还会额外生成一个无参构造函数
示例二:@Getter @Setter 注解在类上,表示为类中的所有字段生成Getter&Setter方法。
- 源代码
@Getter
@Setter
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成的代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public static void main(String[] args) {
System.out.println(5);
}
public Integer getEmpno() {
return this.empno;
}
public String getEname() {
return this.ename;
}
public String getJob() {
return this.job;
}
public Integer getMgr() {
return this.mgr;
}
public LocalDate getHiredate() {
return this.hiredate;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setJob(String job) {
this.job = job;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
}
@NonNull
生成setter方法时会参数是否为空检查
为字段赋值时(即调用字段的setter方法时),如果传的参数为null,则会抛出空异常NullPointerException
- 源代码
@Getter
@Setter
public class Emp {
@NonNull
private Integer empno;
private String ename;
}
- 生成的代码
public class Emp {
@NonNull
private Integer empno;
private String ename;
public Emp() {
}
@NonNull
public Integer getEmpno() {
return this.empno;
}
public void setEmpno(@NonNull Integer empno) {
if (empno == null) {
throw new NullPointerException("empno is marked non-null but is null");
} else {
this.empno = empno;
}
}
public String getEname() {
return this.ename;
}
public void setEname(String ename) {
this.ename = ename;
}
}
@NoArgsConstructor
生成一个无参构造方法。当类中有final字段没有被初始化时,编译器会报错,此时可用@NoArgsConstructor(force = true),然后就会为没有初始化的final字段设置默认值 0 / false / null, 这样编译器就不会报错。
对于具有约束的字段(例如@NonNull字段),不会生成检查或分配,因此请注意,正确初始化这些字段之前,这些约束无效。
final字段未初始化编译器报错:
- 源代码
@Setter
@NoArgsConstructor(force = true)
public class Emp {
@NonNull
private Integer empno;
private final String ename;
}
- 生成的代码
public class Emp {
@NonNull
private Integer empno;
private final String ename = null;
public static void main(String[] args) {
System.out.println(5);
}
public void setEmpno(@NonNull Integer empno) {
if (empno == null) {
throw new NullPointerException("empno is marked non-null but is null");
} else {
this.empno = empno;
}
}
public Emp() {
}
}
@RequiredArgsConstructor
生成构造方法(可能带参数也可能不带参数),如果带参数,这参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。
@RequiredArgsConstructor(staticName = “of”)会生成一个of()的静态方法,并把构造方法设置为私有的
示例一:生成不带参数的构造方法
- 源代码
@RequiredArgsConstructor
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public static void main(String[] args) {
System.out.println(5);
}
public Emp() {
}
}
示例二:参数只能是以final修饰的未经初始化的字段,或者是以@NonNull注解的未经初始化的字段。
- 源代码
@RequiredArgsConstructor
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename = "zhangsan";
private final String job;
private final Integer mgr =1234;
private LocalDate hiredate;
}
- 生成的代码
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename;
private final String job;
private final Integer mgr;
private LocalDate hiredate;
public Emp(@NotNull Integer empno, String job) {
if (empno == null) {
$$$reportNull$$$0(0);
}
super();
this.ename = "zhangsan";
this.mgr = 1234;
if (empno == null) {
throw new NullPointerException("empno is marked non-null but is null");
} else {
this.empno = empno;
this.job = job;
}
}
}
示例三:生成一个of()的静态方法,并把构造方法设置为私有的
- 源代码
@RequiredArgsConstructor( staticName = "of")
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename = "zhangsan";
private final String job;
private final Integer mgr =1234;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename;
private final String job;
private final Integer mgr;
private LocalDate hiredate;
private Emp(@NotNull Integer empno, String job) {
if (empno == null) {
$$$reportNull$$$0(0);
}
super();
this.ename = "zhangsan";
this.mgr = 1234;
if (empno == null) {
throw new NullPointerException("empno is marked non-null but is null");
} else {
this.empno = empno;
this.job = job;
}
}
public static Emp of(@NotNull Integer empno, String job) {
if (empno == null) {
$$$reportNull$$$0(1);
}
return new Emp(empno, job);
}
}
@AllArgsConstructor
生成一个全参数的构造方法
示例一
- 源代码
@AllArgsConstructor
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
}
}
示例二
- 源代码
@AllArgsConstructor
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename = "zhangsan";
private final String job;
private final Integer mgr =1234; //不会出现在生成的构造方法中
private LocalDate hiredate;
}
- 生成代码
public class Emp {
@NotNull
private Integer empno;
@NotNull
private String ename;
private final String job;
private final Integer mgr;
private LocalDate hiredate;
public Emp(@NotNull Integer empno, @NotNull String ename, String job, LocalDate hiredate) {
if (empno == null) {
$$$reportNull$$$0(0);
}
if (ename == null) {
$$$reportNull$$$0(1);
}
super();
this.ename = "zhangsan";
this.mgr = 1234;
if (empno == null) {
throw new NullPointerException("empno is marked non-null but is null");
} else if (ename == null) {
throw new NullPointerException("ename is marked non-null but is null");
} else {
this.empno = empno;
this.ename = ename;
this.job = job;
this.hiredate = hiredate;
}
}
}
构造方法综合示例:
如果要同时生成默认构造方法、指定参数构造方法、全参构造方法,可以采用Lombok自动生成无参和全参的构造方法,然后手工添加指定参数的构造方法
- 源代码
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
//手工生成指定参数的构造方法
public Emp(Integer empno, String ename, String job) {
this.empno = empno;
this.ename = ename;
this.job = job;
}
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp(Integer empno, String ename, String job) {
this.empno = empno;
this.ename = ename;
this.job = job;
}
public Emp() {
}
public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
}
}
@ToString
生成toString()方法,默认情况下它会按顺序(以逗号分隔)打印你的类名称以及每个字段。
还可以设置不包含哪些字段,可以指定一个也可以指定多个@ToString(exclude = “id”) / @ToString(exclude = {“id”,“name”})
如果继承的有父类的话,可以设置callSuper 让其调用父类的toString()方法,例如:@ToString(callSuper = true)
示例一:
- 源代码
@ToString
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public String toString() {
return "Emp(empno=" + this.empno + ", ename=" + this.ename + ", job=" + this.job + ", mgr=" + this.mgr + ", hiredate=" + this.hiredate + ")";
}
}
示例二:
- 源代码
@ToString(exclude = {"hiredate","job"})
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public String toString() {
return "Emp(empno=" + this.empno + ", ename=" + this.ename + ", mgr=" + this.mgr + ")";
}
}
示例三:
- 源代码
@ToString(exclude = {"hiredate","job"},callSuper = true)
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public static void main(String[] args) {
System.out.println(3 + 2);
}
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public static void main(String[] args) {
System.out.println(5);
}
public String toString() {
return "Emp(super=" + super.toString() + ", empno=" + this.empno + ", ename=" + this.ename + ", mgr=" + this.mgr + ")";
}
}
@EqualsAndHashCode
生成hashCode()和equals()方法,默认情况下,它将使用所有非静态,非transient字段。但可以通过在可选的exclude参数中来排除更多字段。或者,通过在of参数中命名它们来准确指定希望使用哪些字段。
示例一:
- 源代码
@EqualsAndHashCode
public class Emp {
private Integer empno;
private String ename;
private static String job;
private Integer mgr;
private transient LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private static String job;
private Integer mgr;
private transient LocalDate hiredate;
public Emp() {
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
if (!other.canEqual(this)) {
return false;
} else {
label47: {
Object this$empno = this.empno;
Object other$empno = other.empno;
if (this$empno == null) {
if (other$empno == null) {
break label47;
}
} else if (this$empno.equals(other$empno)) {
break label47;
}
return false;
}
Object this$ename = this.ename;
Object other$ename = other.ename;
if (this$ename == null) {
if (other$ename != null) {
return false;
}
} else if (!this$ename.equals(other$ename)) {
return false;
}
Object this$mgr = this.mgr;
Object other$mgr = other.mgr;
if (this$mgr == null) {
if (other$mgr != null) {
return false;
}
} else if (!this$mgr.equals(other$mgr)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof Emp;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $empno = this.empno;
int result = result * 59 + ($empno == null ? 43 : $empno.hashCode());
Object $ename = this.ename;
result = result * 59 + ($ename == null ? 43 : $ename.hashCode());
Object $mgr = this.mgr;
result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode());
return result;
}
}
示例二:exclude 排除字段
- 源代码
@EqualsAndHashCode(exclude = {"mgr","hiredate"})
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
if (!other.canEqual(this)) {
return false;
} else {
label47: {
Object this$empno = this.empno;
Object other$empno = other.empno;
if (this$empno == null) {
if (other$empno == null) {
break label47;
}
} else if (this$empno.equals(other$empno)) {
break label47;
}
return false;
}
Object this$ename = this.ename;
Object other$ename = other.ename;
if (this$ename == null) {
if (other$ename != null) {
return false;
}
} else if (!this$ename.equals(other$ename)) {
return false;
}
Object this$job = this.job;
Object other$job = other.job;
if (this$job == null) {
if (other$job != null) {
return false;
}
} else if (!this$job.equals(other$job)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof Emp;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $empno = this.empno;
int result = result * 59 + ($empno == null ? 43 : $empno.hashCode());
Object $ename = this.ename;
result = result * 59 + ($ename == null ? 43 : $ename.hashCode());
Object $job = this.job;
result = result * 59 + ($job == null ? 43 : $job.hashCode());
return result;
}
}
示例一:of 指定要包含的字段
- 源代码
@EqualsAndHashCode(of = {"mgr","hiredate"})
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public static void main(String[] args) {
System.out.println(5);
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
if (!other.canEqual(this)) {
return false;
} else {
Object this$mgr = this.mgr;
Object other$mgr = other.mgr;
if (this$mgr == null) {
if (other$mgr != null) {
return false;
}
} else if (!this$mgr.equals(other$mgr)) {
return false;
}
Object this$hiredate = this.hiredate;
Object other$hiredate = other.hiredate;
if (this$hiredate == null) {
if (other$hiredate != null) {
return false;
}
} else if (!this$hiredate.equals(other$hiredate)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof Emp;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $mgr = this.mgr;
int result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode());
Object $hiredate = this.hiredate;
result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode());
return result;
}
}
@Data
@Data 包含了 @ToString、@EqualsAndHashCode、@Getter / @Setter和@RequiredArgsConstructor的功能
示例:
- 源代码
@Data
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
public Emp() {
}
public Integer getEmpno() {
return this.empno;
}
public String getEname() {
return this.ename;
}
public String getJob() {
return this.job;
}
public Integer getMgr() {
return this.mgr;
}
public LocalDate getHiredate() {
return this.hiredate;
}
public void setEmpno(Integer empno) {
this.empno = empno;
}
public void setEname(String ename) {
this.ename = ename;
}
public void setJob(String job) {
this.job = job;
}
public void setMgr(Integer mgr) {
this.mgr = mgr;
}
public void setHiredate(LocalDate hiredate) {
this.hiredate = hiredate;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
if (!other.canEqual(this)) {
return false;
} else {
label71: {
Object this$empno = this.getEmpno();
Object other$empno = other.getEmpno();
if (this$empno == null) {
if (other$empno == null) {
break label71;
}
} else if (this$empno.equals(other$empno)) {
break label71;
}
return false;
}
Object this$ename = this.getEname();
Object other$ename = other.getEname();
if (this$ename == null) {
if (other$ename != null) {
return false;
}
} else if (!this$ename.equals(other$ename)) {
return false;
}
label57: {
Object this$job = this.getJob();
Object other$job = other.getJob();
if (this$job == null) {
if (other$job == null) {
break label57;
}
} else if (this$job.equals(other$job)) {
break label57;
}
return false;
}
Object this$mgr = this.getMgr();
Object other$mgr = other.getMgr();
if (this$mgr == null) {
if (other$mgr != null) {
return false;
}
} else if (!this$mgr.equals(other$mgr)) {
return false;
}
Object this$hiredate = this.getHiredate();
Object other$hiredate = other.getHiredate();
if (this$hiredate == null) {
if (other$hiredate == null) {
return true;
}
} else if (this$hiredate.equals(other$hiredate)) {
return true;
}
return false;
}
}
}
protected boolean canEqual(Object other) {
return other instanceof Emp;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $empno = this.getEmpno();
int result = result * 59 + ($empno == null ? 43 : $empno.hashCode());
Object $ename = this.getEname();
result = result * 59 + ($ename == null ? 43 : $ename.hashCode());
Object $job = this.getJob();
result = result * 59 + ($job == null ? 43 : $job.hashCode());
Object $mgr = this.getMgr();
result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode());
Object $hiredate = this.getHiredate();
result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode());
return result;
}
public String toString() {
return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ")";
}
}
@Value
@Value 将字段都变成不可变类型:使用final修饰, 同时还包含@ToString、@EqualsAndHashCode、@AllArgsConstructor 、@Getter(注意只有Getter没有Setter)
示例:
- 源代码
@Value
public class Emp {
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
}
- 生成代码
public final class Emp {
private final Integer empno;
private final String ename;
private final String job;
private final Integer mgr;
private final LocalDate hiredate;
public Emp(Integer empno, String ename, String job, Integer mgr, LocalDate hiredate) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
}
public Integer getEmpno() {
return this.empno;
}
public String getEname() {
return this.ename;
}
public String getJob() {
return this.job;
}
public Integer getMgr() {
return this.mgr;
}
public LocalDate getHiredate() {
return this.hiredate;
}
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
Object this$empno = this.getEmpno();
Object other$empno = other.getEmpno();
if (this$empno == null) {
if (other$empno != null) {
return false;
}
} else if (!this$empno.equals(other$empno)) {
return false;
}
label61: {
Object this$ename = this.getEname();
Object other$ename = other.getEname();
if (this$ename == null) {
if (other$ename == null) {
break label61;
}
} else if (this$ename.equals(other$ename)) {
break label61;
}
return false;
}
label54: {
Object this$job = this.getJob();
Object other$job = other.getJob();
if (this$job == null) {
if (other$job == null) {
break label54;
}
} else if (this$job.equals(other$job)) {
break label54;
}
return false;
}
Object this$mgr = this.getMgr();
Object other$mgr = other.getMgr();
if (this$mgr == null) {
if (other$mgr != null) {
return false;
}
} else if (!this$mgr.equals(other$mgr)) {
return false;
}
Object this$hiredate = this.getHiredate();
Object other$hiredate = other.getHiredate();
if (this$hiredate == null) {
if (other$hiredate != null) {
return false;
}
} else if (!this$hiredate.equals(other$hiredate)) {
return false;
}
return true;
}
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $empno = this.getEmpno();
int result = result * 59 + ($empno == null ? 43 : $empno.hashCode());
Object $ename = this.getEname();
result = result * 59 + ($ename == null ? 43 : $ename.hashCode());
Object $job = this.getJob();
result = result * 59 + ($job == null ? 43 : $job.hashCode());
Object $mgr = this.getMgr();
result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode());
Object $hiredate = this.getHiredate();
result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode());
return result;
}
public String toString() {
return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ")";
}
}
@Log
生成log对象,用于记录日志,可以通过topic属性来设置getLogger(String name)方法的参数 例如 @Log4j(topic = “com.xxx.entity.User”),默认是类的全限定名,即 类名.class,log支持以下几种:
- @Log java.util.logging.Logger
- @Log4j org.apache.log4j.Logger
- @Log4j2 org.apache.logging.log4j.Logger
- @Slf4j org.slf4j.Logger
- @XSlf4j org.slf4j.ext.XLogger
- @CommonsLog org.apache.commons.logging.Log
- @JBossLog org.jboss.logging.Logger
示例一:
- Maven依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-access</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
- 源代码
package com.hc.domain;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class Emp {
public static void main(String[] args) {
log.info("info","hahaa");
}
}
- 生成代码
package com.hc.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Emp {
private static final Logger log = LoggerFactory.getLogger(Emp.class);
public Emp() {
}
public static void main(String[] args) {
log.info("info", "hahaa");
}
}
结果:
示例二:
- 源代码
package com.hc.domain;
import lombok.extern.slf4j.Slf4j;
@Slf4j(topic = "com.hc.demo")
public class Emp {
public static void main(String[] args) {
log.info("info","hahaa");
}
}
- 生成代码
package com.hc.domain;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Emp {
private static final Logger log = LoggerFactory.getLogger("com.hc.demo");
public Emp() {
}
public static void main(String[] args) {
log.info("info", "hahaa");
}
}
- 结果
@SneakyThrows
示例:
- 源代码
public class LombokDemo {
@SneakyThrows
public void fun1(){
Thread.sleep(1000);
}
@SneakyThrows(InterruptedException.class)
public void fun2(){
Thread.sleep(1000);
}
}
- 生成代码
public class LombokDemo {
public LombokDemo() {
}
public void fun1() {
try {
Thread.sleep(1000L);
} catch (Throwable var2) {
throw var2;
}
}
public void fun2() {
try {
Thread.sleep(1000L);
} catch (InterruptedException var2) {
throw var2;
}
}
}
@Synchronized:给方法加上同步锁
示例:
- 源代码
public class LombokDemo {
@Synchronized
public void fun1() {
System.out.println("fun1");
}
private final Object readLock = new Object();
@Synchronized("readLock")
public void fun2() {
System.out.println("fun1");
}
@Synchronized
public static void fun3() {
System.out.println("fun1");
}
}
- 生成代码
public class LombokDemo {
private final Object $lock = new Object[0];
private static final Object $LOCK = new Object[0];
private final Object readLock = new Object();
public LombokDemo() {
}
public void fun1() {
synchronized(this.$lock) {
System.out.println("fun1");
}
}
public void fun2() {
synchronized(this.readLock) {
System.out.println("fun1");
}
}
public static void fun3() {
synchronized($LOCK) {
System.out.println("fun1");
}
}
}
Cleanup
主要用来修饰 IO 流相关类, 会在 finally 代码块中对该资源进行 close();
示例一:
- 源代码
public class LombokDemo {
public static void fileCopy(File sources, File aim) throws IOException {// psvm
@Cleanup FileInputStream fis = new FileInputStream(sources);
@Cleanup FileOutputStream fos = new FileOutputStream(aim);
byte[] buf = new byte[256];
int len = -1;
while ((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
}
}
- 生成代码
public class LombokDemo {
public LombokDemo() {
}
public static void fileCopy(File sources, File aim) throws IOException {
FileInputStream fis = new FileInputStream(sources);
try {
FileOutputStream fos = new FileOutputStream(aim);
try {
byte[] buf = new byte[256];
boolean var5 = true;
int len;
while((len = fis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
} finally {
if (Collections.singletonList(fos).get(0) != null) {
fos.close();
}
}
} finally {
if (Collections.singletonList(fis).get(0) != null) {
fis.close();
}
}
}
}
@Getter(lazy = true)
标注字段为懒加载字段,懒加载字段在创建对象时不会进行初始化,而是在第一次访问的时候才会初始化,后面再次访问也不会重复初始化
对照代码
public class LombokDemo {
private final List<String> list = getListFromCache();
private List<String> getListFromCache() {
System.out.println("getListFromCache");
return new ArrayList<>();
}
public static void main(String[] args) {
LombokDemo lombokDemo = new LombokDemo();
System.out.println("-----------");
System.out::println(lombokDemo.list);
}
}
运行main方法,初始化对象LombokDemo时,会调用getListFromCache()方法,如下图所示:
- 源代码
public class LombokDemo {
@Getter(lazy = true)
private final List<String> list = getListFromCache();
private List<String> getListFromCache() {
System.out.println("getListFromCache");
return new ArrayList<>();
}
public static void main(String[] args) {
LombokDemo lombokDemo = new LombokDemo();
System.out.println("-----------");
lombokDemo.getList(); // 使用注解 @Getter(lazy = true)后会生成这样一个getter方法
}
}
- 生成代码
public class LombokDemo {
private final AtomicReference<Object> list = new AtomicReference();
public LombokDemo() {
}
private List<String> getListFromCache() {
System.out.println("getListFromCache");
return new ArrayList();
}
public static void main(String[] args) {
LombokDemo lombokDemo = new LombokDemo();
System.out.println("-----------");
lombokDemo.getList();
}
public List<String> getList() {
Object value = this.list.get();
if (value == null) {
synchronized(this.list) {
value = this.list.get();
if (value == null) {
List<String> actualValue = this.getListFromCache();
value = actualValue == null ? this.list : actualValue;
this.list.set(value);
}
}
}
return (List)((List)(value == this.list ? null : value));
}
}
@Delegate
为List类型的字段生成一大堆常用的方法,其实这些方法都是List中的方法
- 源代码
public class LombokDemo {
@Delegate
private List<String> list ;
}
- 生成代码
public class LombokDemo {
private List<String> list;
public LombokDemo() {
}
public static void main(String[] args) {
}
public int size() {
return this.list.size();
}
public boolean isEmpty() {
return this.list.isEmpty();
}
public boolean contains(Object arg0) {
return this.list.contains(arg0);
}
public Iterator<String> iterator() {
return this.list.iterator();
}
public Object[] toArray() {
return this.list.toArray();
}
public <T> T[] toArray(T[] arg0) {
return this.list.toArray(arg0);
}
public boolean add(String arg0) {
return this.list.add(arg0);
}
public boolean remove(Object arg0) {
return this.list.remove(arg0);
}
public boolean containsAll(Collection<?> arg0) {
return this.list.containsAll(arg0);
}
public boolean addAll(Collection<? extends String> arg0) {
return this.list.addAll(arg0);
}
public boolean addAll(int arg0, Collection<? extends String> arg1) {
return this.list.addAll(arg0, arg1);
}
public boolean removeAll(Collection<?> arg0) {
return this.list.removeAll(arg0);
}
public boolean retainAll(Collection<?> arg0) {
return this.list.retainAll(arg0);
}
public void replaceAll(UnaryOperator<String> arg0) {
this.list.replaceAll(arg0);
}
public void sort(Comparator<? super String> arg0) {
this.list.sort(arg0);
}
public void clear() {
this.list.clear();
}
public String get(int arg0) {
return (String)this.list.get(arg0);
}
public String set(int arg0, String arg1) {
return (String)this.list.set(arg0, arg1);
}
public void add(int arg0, String arg1) {
this.list.add(arg0, arg1);
}
public String remove(int arg0) {
return (String)this.list.remove(arg0);
}
public int indexOf(Object arg0) {
return this.list.indexOf(arg0);
}
public int lastIndexOf(Object arg0) {
return this.list.lastIndexOf(arg0);
}
public ListIterator<String> listIterator() {
return this.list.listIterator();
}
public ListIterator<String> listIterator(int arg0) {
return this.list.listIterator(arg0);
}
public List<String> subList(int arg0, int arg1) {
return this.list.subList(arg0, arg1);
}
public Spliterator<String> spliterator() {
return this.list.spliterator();
}
}
注意:一个类中只能使用一个@Delegate注解,因为使用多个会生成多个size()方法,从而会编译报错。
综合示例
- 源代码
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDate;
/**
* 员工
*
* @author HC
*/
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Emp {
/**
* 员工编号
*/
private Integer empno;
/**
* 员工姓名
*/
private String ename;
/**
* 工作
*/
private String job;
/**
* 上级领导编号
*/
private Integer mgr;
/**
* 受雇日期
*/
private LocalDate hiredate;
/**
* 薪资
*/
private Double sal;
/**
* 奖金
*/
private Double comm;
/**
* 部门编号
*/
private Integer deptno;
@Synchronized
public void cleanUp() {
try {
@Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(new byte[] {'a','b','c'});
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
- 生成的代码
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.time.LocalDate;
import java.util.Collections;
public class Emp {
private final Object $lock = new Object[0];
private Integer empno;
private String ename;
private String job;
private Integer mgr;
private LocalDate hiredate;
private Double sal;
private Double comm;
private Integer deptno;
public void cleanUp() {
synchronized(this.$lock) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
baos.write(new byte[]{97, 98, 99});
System.out.println(baos.toString());
} finally {
if (Collections.singletonList(baos).get(0) != null) {
baos.close();
}
}
} catch (IOException var9) {
var9.printStackTrace();
}
}
}
public Integer getEmpno() {
return this.empno;
}
public String getEname() {
return this.ename;
}
public String getJob() {
return this.job;
}
public Integer getMgr() {
return this.mgr;
}
public LocalDate getHiredate() {
return this.hiredate;
}
public Double getSal() {
return this.sal;
}
public Double getComm() {
return this.comm;
}
public Integer getDeptno() {
return this.deptno;
}
public void setEmpno(final Integer empno) {
this.empno = empno;
}
public void setEname(final String ename) {
this.ename = ename;
}
public void setJob(final String job) {
this.job = job;
}
public void setMgr(final Integer mgr) {
this.mgr = mgr;
}
public void setHiredate(final LocalDate hiredate) {
this.hiredate = hiredate;
}
public void setSal(final Double sal) {
this.sal = sal;
}
public void setComm(final Double comm) {
this.comm = comm;
}
public void setDeptno(final Integer deptno) {
this.deptno = deptno;
}
public boolean equals(final Object o) {
if (o == this) {
return true;
} else if (!(o instanceof Emp)) {
return false;
} else {
Emp other = (Emp)o;
if (!other.canEqual(this)) {
return false;
} else {
label107: {
Object this$empno = this.getEmpno();
Object other$empno = other.getEmpno();
if (this$empno == null) {
if (other$empno == null) {
break label107;
}
} else if (this$empno.equals(other$empno)) {
break label107;
}
return false;
}
Object this$ename = this.getEname();
Object other$ename = other.getEname();
if (this$ename == null) {
if (other$ename != null) {
return false;
}
} else if (!this$ename.equals(other$ename)) {
return false;
}
Object this$job = this.getJob();
Object other$job = other.getJob();
if (this$job == null) {
if (other$job != null) {
return false;
}
} else if (!this$job.equals(other$job)) {
return false;
}
label86: {
Object this$mgr = this.getMgr();
Object other$mgr = other.getMgr();
if (this$mgr == null) {
if (other$mgr == null) {
break label86;
}
} else if (this$mgr.equals(other$mgr)) {
break label86;
}
return false;
}
label79: {
Object this$hiredate = this.getHiredate();
Object other$hiredate = other.getHiredate();
if (this$hiredate == null) {
if (other$hiredate == null) {
break label79;
}
} else if (this$hiredate.equals(other$hiredate)) {
break label79;
}
return false;
}
label72: {
Object this$sal = this.getSal();
Object other$sal = other.getSal();
if (this$sal == null) {
if (other$sal == null) {
break label72;
}
} else if (this$sal.equals(other$sal)) {
break label72;
}
return false;
}
Object this$comm = this.getComm();
Object other$comm = other.getComm();
if (this$comm == null) {
if (other$comm != null) {
return false;
}
} else if (!this$comm.equals(other$comm)) {
return false;
}
Object this$deptno = this.getDeptno();
Object other$deptno = other.getDeptno();
if (this$deptno == null) {
if (other$deptno != null) {
return false;
}
} else if (!this$deptno.equals(other$deptno)) {
return false;
}
return true;
}
}
}
protected boolean canEqual(final Object other) {
return other instanceof Emp;
}
public int hashCode() {
int PRIME = true;
int result = 1;
Object $empno = this.getEmpno();
int result = result * 59 + ($empno == null ? 43 : $empno.hashCode());
Object $ename = this.getEname();
result = result * 59 + ($ename == null ? 43 : $ename.hashCode());
Object $job = this.getJob();
result = result * 59 + ($job == null ? 43 : $job.hashCode());
Object $mgr = this.getMgr();
result = result * 59 + ($mgr == null ? 43 : $mgr.hashCode());
Object $hiredate = this.getHiredate();
result = result * 59 + ($hiredate == null ? 43 : $hiredate.hashCode());
Object $sal = this.getSal();
result = result * 59 + ($sal == null ? 43 : $sal.hashCode());
Object $comm = this.getComm();
result = result * 59 + ($comm == null ? 43 : $comm.hashCode());
Object $deptno = this.getDeptno();
result = result * 59 + ($deptno == null ? 43 : $deptno.hashCode());
return result;
}
public String toString() {
return "Emp(empno=" + this.getEmpno() + ", ename=" + this.getEname() + ", job=" + this.getJob() + ", mgr=" + this.getMgr() + ", hiredate=" + this.getHiredate() + ", sal=" + this.getSal() + ", comm=" + this.getComm() + ", deptno=" + this.getDeptno() + ")";
}
public Emp() {
}
public Emp(final Integer empno, final String ename, final String job, final Integer mgr, final LocalDate hiredate, final Double sal, final Double comm, final Integer deptno) {
this.empno = empno;
this.ename = ename;
this.job = job;
this.mgr = mgr;
this.hiredate = hiredate;
this.sal = sal;
this.comm = comm;
this.deptno = deptno;
}
}