需求
近日开发有个需求要获取类属性的名称,只是想简单便捷的调用下。
举例来说,一个实体类 User 含有 id 和 userName 两个属性,现在想要获取 “id” 和 “userName” 两个属性名的字符串。
偷懒思路
想到 Lombok 在通过注解简化实体类方面有不错的效果,所以想找下 Lombok 是否有什么注解方便实现本需求。
偷懒之路
经过百度+谷歌的检索定位到了 @FieldNameConstants
满足需求。
偷懒所得
@FieldNameConstants官网介绍
注意:
Lombok 不同版本对于注解 @FieldNameConstants
效果会有所不同,上面给出的官网下面的 Small print
章节给出了历史版本的迭代情况,本文使用的 Lombok 版本为 1.18.16
个人解析:
直接使用效果
抄袭官方代码Demo1
import lombok.experimental.FieldNameConstants;
import lombok.AccessLevel;
@FieldNameConstants
public class FieldNameConstantsExample {
private final String iAmAField;
private final int andSoAmI;
// 添加 @ 这个注解表示该属性名不需要提供属性名
@
private final int asAmI;
}
抄袭官方Demo2 ,下面代码就是 Lombok 使用注解后最终 java 代码效果。本质上生成了一个内部类 Fields
。
public class FieldNameConstantsExample {
private final String iAmAField;
private final int andSoAmI;
private final int asAmI;
public static final class Fields {
public static final String iAmAField = "iAmAField";
public static final String andSoAmI = "andSoAmI";
}
}
用Junit调用
package lombok.fieldNameConstatns;
import org.junit.Test;
public class LombokConstantsTest {
@Test
public void constatnsTest(){
System.out.println(FieldNameConstantsExample.Fields.iAmAField);
//输出内容: iAmAField
// 由于上个代码片段 asAmI 字段被 @ 注解修饰,所以无法被调用
// ();//获取不到 asAmI属性!!
}
}
可以看到输出的字符串iAmAField
跟声明的大小写是完全一致的。
一些定制需求
- 如果希望使用枚举类型: @FieldNameConstants(asEnum = true)
- 如果希望使用是全大写的输出结果,修改lombok配置,注解方式无法配置!
= true
- 默认内部类名是
Fields
,而且是public
。如果想临时修改,可以使用注解配置:@FieldNameConstants(innerTypeName = "FieldNames", access = )
; 如果想统一修改内部类名,可以修改 lombok 配置文件