最近有这么一个需求,但愿把系统中的枚举类型做为数据字典返回给前端,作编辑页的下拉选项。由于枚举类型不少,一个一个提供接口就有点儿太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", "指定类型未找到");
}
==============
顺便说一下我对枚举类型使用的见解,不必定对,欢迎指正:
- 使用于系统内部使用,仍是挺方便的,便于管理。在数据库sql的转换上也不须要特殊处理。(Mybatis有映射的机制)
- 系统间的传递数据确实不适合,好在转成String类型也能够是自动的
- 做为数据字典,能够使用数据库做为补充。那些不变的,跟系统功能高度相关的类型,用enum管理(增长类型,须要修改enum及其相关的业务代码);那些跟业务弱相关且须要动态变化的,能够在数据库里建一个dict表,放在管理后台维护。