用反射的方法获取枚举值(数据字典)
最近有这么一个需求,希望把系统中的枚举类型作为数据字典返回给前端,做编辑页的下拉选项。因为枚举类型很多,一个一个提供接口就有点儿太low了……,所以想到了java的反射机制。在网上找到了一个例子,作为参考:
Java 将枚举存入List集合(https://blog.csdn.net/qq_22158021/article/details/78091978)
我并没有做得那么复杂,只是简单的使用了反射机制,直接上代码:
接口类,所有的枚举类型都继承这个接口类:
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", "指定类型未找到");
}
==============
顺便说一下我对枚举类型使用的看法,不一定对,欢迎指正:
- 使用于系统内部使用,还是挺方便的,便于管理。在数据库sql的转换上也不需要特殊处理。(Mybatis有映射的机制)
- 系统间的传递数据确实不适合,好在转成String类型也可以是自动的
- 作为数据字典,可以使用数据库作为补充。那些不变的,跟系统功能高度相关的类型,用enum管理(增加类型,需要修改enum及其相关的业务代码);那些跟业务弱相关且需要动态变化的,可以在数据库里建一个dict表,放在管理后台维护。