用反射的方法获取枚举值(数据字典)

Posted wangjuns8

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用反射的方法获取枚举值(数据字典)相关的知识,希望对你有一定的参考价值。

最近有这么一个需求,希望把系统中的枚举类型作为数据字典返回给前端,做编辑页的下拉选项。因为枚举类型很多,一个一个提供接口就有点儿太low了……,所以想到了java的反射机制。在网上找到了一个例子,作为参考:
 
 
我并没有做得那么复杂,只是简单的使用了反射机制,直接上代码:
 
接口类,所有的枚举类型都继承这个接口类:
package com.my.utils;
public interface EnumMessage {
String getKey();
String getValue();
}
 
枚举类:
package com.my.enumtype;
import com.my.utils.EnumMessage;
public enum Status implements EnumMessage {
ACTIVE("正常"),
CLOSED("关闭"),
DELETED("删除");
 
public String getDesc() {
return desc;
}
 
private String desc;
 
private Status(String desc) {
this.desc = desc;
}
 
@Override
public String getValue() { return desc;}
@Override
public String getKey() { return name(); }
}
 
由于返回的entity类:
public class KeyValue implements Serializable {
private String key;
private String value;
public String getKey() { return key; }
public void setKey(String key) { this.key = key; }
public String getValue() { return value; }
public void setValue(String value) { this.value = value; }
}
 
调用方法:
public Map<String, Object> getDict(String enumName) {
try {
List<KeyValue> keyValueList = new ArrayList<KeyValue>();
 
Class cls = Class.forName("com.my.enumtype." + enumName);
Method method = cls.getMethod("values");
EnumMessage inter[] = (EnumMessage[]) method.invoke(null, null);
for (EnumMessage enumMessage : inter) {
KeyValue vo = new KeyValue();
vo.setKey( enumMessage.getKey() );
vo.setValue( enumMessage.getValue() );
keyValueList.add(vo);
}
 
return Collections.singletonMap("data", keyValueList);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return Collections.singletonMap("ERROR", "指定类型未找到");
}
 
==============
顺便说一下我对枚举类型使用的看法,不一定对,欢迎指正:
  1. 使用于系统内部使用,还是挺方便的,便于管理。在数据库sql的转换上也不需要特殊处理。(Mybatis有映射的机制)
  2. 系统间的传递数据确实不适合,好在转成String类型也可以是自动的
  3. 作为数据字典,可以使用数据库作为补充。那些不变的,跟系统功能高度相关的类型,用enum管理(增加类型,需要修改enum及其相关的业务代码);那些跟业务弱相关且需要动态变化的,可以在数据库里建一个dict表,放在管理后台维护。
 
 

以上是关于用反射的方法获取枚举值(数据字典)的主要内容,如果未能解决你的问题,请参考以下文章

java开发中使用枚举表述数据字典

javajava反射机制,动态获取对象的属性和对应的参数值,并属性按照字典序排序,Field.setAccessible()方法的说明可用于微信支付 签名生成

字典和枚举

Python数据类型:字典类型及常用方法(updatedelpopkeysvaluesitemssort)

如何将 XML 属性值添加到包含对象的字典中

python dict用法