日常总结:获取枚举类通用接口

2024-06-20  本文已影响0人  灿烂的GL

场景:前端有些需要获取枚举类的接口
实现逻辑:通过反射机制写一个通用方法来获取枚举类
1、通用方法实现:

@Slf4j
public class EnumUtils {

    @Data
    public static class EnumData {
        private Object name;
        private Object code;
    }

    /**
     * 将枚举类的指定属性转换为EnumData的code和name属性
     * @param enumClass 枚举类
     * @return
     */
    public static List<EnumData> getEnumList(Class<?> enumClass, String codeField, String nameField) {
        try {
            Object[] oo = enumClass.getEnumConstants();
            List<EnumData> list = new LinkedList<>();

            for (Object o : oo) {
                EnumData enumEntity = convertToEnumMeta(enumClass, o, codeField, nameField);
                list.add(enumEntity);
            }
            return list;
        } catch (Exception e) {
            log.warn("枚举类 {} 解析异常", enumClass.getCanonicalName(), e);
            return Collections.emptyList();
        }
    }

        /**
         * 将枚举类对象转换为EnumData 对象
         */
        private static EnumData convertToEnumMeta(Class clazz, Object o, String codeField, String nameField) throws Exception {
            EnumData enumEntity = new EnumData();

            Field field = clazz.getDeclaredField(codeField);
            Object code = ReflectUtil.getFieldValue(o, field);
            enumEntity.setCode(code);

            Field field1 = clazz.getDeclaredField(nameField);
            Object name = ReflectUtil.getFieldValue(o, field1);
            enumEntity.setName(name);

            return enumEntity;
        }
}

2、接口调用
这里的“code”和“name”就是枚举类中定义的变量名

    @GetMapping(value = "/enum")
    public Result<List<EnumUtils.EnumData>> getEnumList() {
        return Result.success(EnumUtils.getEnumList(testEnum.class, "code", "name"));
    }

返回数据格式如下:

    * [
     *     {
     *         "code": "value",
     *         "name": "value"
     *     },
     *     {
     *         "code": "value",
     *         "name": "value"
     *     }
     * ]
上一篇 下一篇

猜你喜欢

热点阅读