目录
前置知识:注解
以下是我整理的注解学习线路,按顺序学习完下列知识就可以无痛理解本篇了!
@Getter和@Setter
作用:自动生成Get和Set方法
Getter注解的源代码如下:
package lombok;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface Getter {
AccessLevel value() default AccessLevel.PUBLIC;
AnyAnnotation[] onMethod() default {};
boolean lazy() default false;
/** @deprecated */
@Deprecated
@Retention(RetentionPolicy.SOURCE)
@Target({})
public @interface AnyAnnotation {
}
}
其中,
@Target
指定@Getter
注解可以应用于类和类的字段(成员变量)。也就是说,@Getter
可以为单个字段生成get
方法,或为整个类的所有字段生成get
方法。@Retention(RetentionPolicy.SOURCE)
表示@Getter
是一个编译时注解,只保留在源码中,编译后会被丢弃,不会保留在.class
文件中。value:
value
用于指定生成的getter
方法的访问级别,默认是PUBLIC
,即生成的get
方法默认是public
访问级别。
Setter注解和Getter非常相似,就不再赘述了。
需要注意的是,静态(static)的字段上无法生成Getter和Setter,如果硬要标注,会生成静态的get和set方法。
另外,final类型的字段也不能生成Set方法。
@Accessors
作用:用来控制Getter和Setter的样式
源码如下:
@Target({ElementType.TYPE, ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Accessors {
boolean fluent() default false;
boolean chain() default false;
boolean makeFinal() default false;
String[] prefix() default {};
}
chain
chain
属性用于指定 setter
方法是否支持链式调用。链式调用的意思是,每个 setter
方法返回值不再是void,而是当前对象 this
,从而可以进行连续调用。
例如:
@Accessors(chain = true)
private String name;
//生成的set方法
public MyClass setName(String name) { // 生成的 setter 方法
this.name = name;
//返回this
return this;
}
//调用
MyClass obj = new MyClass()
.setName("John")
.setAge(25);
fluent
fluent
属性用于指定是否生成流式的 getter
和 setter
方法。如果设置为 true
,生成的 getter
和 setter
方法不会以 get
或 set
为前缀,而是直接使用字段名作为方法名
public void name(String name) { // 生成的 setter 方法
this.name = name;
}
public String name() { // 生成的 getter 方法
return this.name;
}
makeFinal
makeFinal
属性用于指定是否为生成的 getter
和 setter
方法中的字段添加 final
修饰符
@ToString
添加@ToString注解后,编译后的javac文件中会多出一个toString方法:
public String toString() {
return "student(name=" + this.getName() + ")";
}
@ToString注解重写了Object类的toString方法,在调用该方法时会将对象的内容以上述格式打印:
student(name=allen)
接下来介绍一下ToString注解的详细使用(不想了解就可以跳过了)
ToString注解的源码如下:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.SOURCE)
public @interface ToString {
boolean includeFieldNames() default true;
String[] exclude() default {};
String[] of() default {};
boolean callSuper() default false;
boolean doNotUseGetters() default false;
boolean onlyExplicitlyIncluded() default false;
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {
}
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.SOURCE)
public @interface Include {
int rank() default 0;
String name() default "";
}
}
-
includeFieldNames
将includeFieldNames设置为false的话,打印出的结果将不包含变量名:
student(allen)
-
exclude
exclude表示打印出的结果不包括指定的变量,比如
@ToString(exclude={"name"})
这样打印出的结果就不包含name变量
of也是同理,表示打印出的结果只包含指定变量
-
callSuper
设置为true时,ToString方法会自动调用父类的ToString方法(不咋常用)
-
doNotUseGetters
默认情况下,ToString的输出会调用get方法,即:
public String toString() {
return "student(name=" + this.getName() + ")";
}
而将doNotUseGetters设置为true后,会直接调用对象的属性:
public String toString() {
return "student(name=" + this.name + ")";
}
-
onlyExplicitlyIncluded
如果设置为true,则ToString方法会只输出类名,变成:
public String toString() {
return "student()";
}
- Exclude和Include
是ToString的两个内部注解,调用方法为:
@ToString.Exclude
Exclude顾名思义,就是输出使不打印指定的元素
Include同理,输出时打印指定的元素,其中rank表示权重,rank越高打印的时候越靠前;name表示ToString方法打印时,等号前面的名字部分
标签:Java,name,default,ToString,注解,Lombok,public,String From: https://blog.csdn.net/LUwantAC/article/details/143093746