背景:根据类属性生成字符串常量,当注解中要使用时就很方便了
@FieldNameConstants是Lombok库中的一个注解,用于自动生成字段名称常量。
当你在类中使用@FieldNameConstants注解时,Lombok会扫描类的所有字段,并为每个字段生成一个对应的常量。
例如,如果你有一个类定义如下:
import lombok.experimental.FieldNameConstants;
@FieldNameConstants
public class MyClass {
private String name;
private Integer age;
}
Lombok会在编译时自动生成以下代码:
public class MyClass {
private String name;
private Integer age;
public static final class Fields {
public static final String name = "name";
public static final String age = "age";
}
}
从IDEA的Structure可以得到验证
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
public @interface FieldNameConstants {
lombok.AccessLevel level() default AccessLevel.PUBLIC;
boolean asEnum() default false;
String innerTypeName() default "";
/**
* Only include fields and methods explicitly marked with {@code @FieldNameConstants.Include}.
* Normally, all (non-static) fields are included by default.
*
* @return If {@code true}, don't include non-static fields automatically (default: {@code false}).
*/
boolean onlyExplicitlyIncluded() default false;
/**
* If present, do not include this field in the generated fieldnames inner type.
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Exclude {}
/**
* If present, include this field in the generated fieldnames inner type (default).
*/lbp晚上也要发布
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE)
public @interface Include {}
}
level可填范围如下,与普通的修饰符一样
默认PUBLIC(lombok.AccessLevel level() default AccessLevel.PUBLIC)
public enum AccessLevel {
PUBLIC, MODULE, PROTECTED, PACKAGE, PRIVATE,
/** Represents not generating anything or the complete lack of a method. */
NONE;
}
用法如下
@FieldNameConstants(level = AccessLevel.PUBLIC)
是否生成枚举类
@FieldNameConstants(asEnum = true) 等于在内部自动生成了一个枚举类
@FieldNameConstants(asEnum = true)
public class MyClass {
private String name;
private Integer age;
public static enum Fields {
name,
age
}
}
自定义内部类名称
@FieldNameConstants(innerTypeName = “AAA”)
等于生成一个AAA的内部类
@FieldNameConstants(innerTypeName = "AAA")
public class MyClass {
private String name;
private Integer age;
public static final class AAA {
public static final String name = "name";
public static final String age = "age";
}
}
表明只引入声明了Include注解的字段,需要与Include搭配使用
@FieldNameConstants(onlyExplicitlyIncluded = true)
表示只生成name属性
@FieldNameConstants(onlyExplicitlyIncluded = true)
public class MyClass {
@FieldNameConstants.Include
private String name;
private Integer age;
public static final class fields {
public static final String name = "name";
}
}
注解中使用
注解@NotNull中message只能使用常量
现在注解里可以使用前面定义的(这里只是展示注解中可以使用,实际情况应该不会用在@NotNull中)
@Slf4j
public class Student {
@NotNull(message = "id不能为空")
private String name;
@NotNull(message = MyClass.Fields.age)
private Integer age;
}