通过Class来获取任意枚举常量里面的值和方法
先准备数据
enum TestEnum{
DEMO(1111,"这是第一个",1),
DEMO2(2222,"这是第二个",2),
DEMO3(3333,"这是第三个",3),
DEMO4(4444,"这是第四个",4),
;
private Integer dictKey;
private String dictValue;
private Integer dictIndex;
TestEnum() {
}
TestEnum(Integer dictKey, String dictValue, Integer dictIndex) {
this.dictKey = dictKey;
this.dictValue = dictValue;
this.dictIndex = dictIndex;
}
public Integer getDictKey() {
return dictKey;
}
public String getDictValue() {
return dictValue;
}
public Integer getDictIndex() {
return dictIndex;
}
}
那么怎么通过class来获取枚举里面的值呢
思路一:获取所有方法然后想办法筛选出我们想要的方法即可
思路二:获取所有字段(Field),筛选出来私有非静态字段,然后根据字段名拼接get来获取对应的方法
Class<TestEnum> testEnumClass = TestEnum.class;
Class<Enum> clazz = (Class<Enum>) Class.forName(testEnumClass.getName());
//获取常量
Enum[] enumConstants = clazz.getEnumConstants();
//获取public字段
//Field[] publicFields = poEnumClass.getFields();
//获取私有非静态字段
List<Field> privateFields = new ArrayList<>();
List<Method> methodList = new ArrayList<>();
Field[] fields = testEnumClass.getDeclaredFields();
for (Field field:fields){
if (Modifier.isPrivate(field.getModifiers())&&!(Modifier.isStatic(field.getModifiers()))) {
privateFields.add(field);
methodList.add(testEnumClass.getMethod("get"+getMethodName(field.getName())));
}
}
首字母转大写
private static String getMethodName(String fildeName) throws Exception{
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}
让我们打断点看一下筛选出来的方法
剩下的就直接根据方法获取值即可
完整代码
@Test
public void test() throws Exception{
Class<TestEnum> testEnumClass = TestEnum.class;
Class<Enum> clazz = (Class<Enum>) Class.forName(testEnumClass.getName());
//获取常量
Enum[] enumConstants = clazz.getEnumConstants();
//获取public字段
//Field[] publicFields = poEnumClass.getFields();
//获取字段
List<Field> privateFields = new ArrayList<>();
List<Method> methodList = new ArrayList<>();
Field[] fields = testEnumClass.getDeclaredFields();
for (Field field:fields){
if (Modifier.isPrivate(field.getModifiers())&&!(Modifier.isStatic(field.getModifiers()))) {
privateFields.add(field);
methodList.add(testEnumClass.getMethod("get"+getMethodName(field.getName())));
}
}
Map<String,Object> dataMap = new HashMap<>();
for (Method method:methodList){
List<Object> dataList = new ArrayList<>();
for (Enum e:enumConstants){
dataList.add(method.invoke(e));
}
dataMap.put(method.getName(),dataList);
}
System.out.println(dataMap);
}
private static String getMethodName(String fildeName) throws Exception{
byte[] items = fildeName.getBytes();
items[0] = (byte) ((char) items[0] - 'a' + 'A');
return new String(items);
}