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


    最近有这么一个需求,希望把系统中的枚举类型作为数据字典返回给前端,做编辑页的下拉选项。因为枚举类型很多,一个一个提供接口就有点儿太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表,放在管理后台维护。
     
     

  • 相关阅读:
    [2020多校联考]甲虫
    .eww
    MinGW安装c-c++
    .竖梁上的两个孔最小距离可以是多少呢?PS15D
    .dwg(sw)-exb
    开始学emacs-1
    看jpg和png图片
    .系列化参数关系
    2015计划
    大蚂蚁在64位系统下,右键没有快发的解决方案
  • 原文地址:https://www.cnblogs.com/wangjuns8/p/9279679.html
Copyright © 2020-2023  润新知