用反射的方法獲取枚舉值(數據字典)

最近有這麼一個需求,但願把系統中的枚舉類型做爲數據字典返回給前端,作編輯頁的下拉選項。由於枚舉類型不少,一個一個提供接口就有點兒太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", "指定類型未找到");
}
 
==============
順便說一下我對枚舉類型使用的見解,不必定對,歡迎指正:
  1. 使用於系統內部使用,仍是挺方便的,便於管理。在數據庫sql的轉換上也不須要特殊處理。(Mybatis有映射的機制)
  2. 系統間的傳遞數據確實不適合,好在轉成String類型也能夠是自動的
  3. 做爲數據字典,能夠使用數據庫做爲補充。那些不變的,跟系統功能高度相關的類型,用enum管理(增長類型,須要修改enum及其相關的業務代碼);那些跟業務弱相關且須要動態變化的,能夠在數據庫裏建一個dict表,放在管理後臺維護。
相關文章
相關標籤/搜索