Java根据枚举名使用反射获取枚举值

2023-11-02

由于前端需要根据枚举名获取实时获取枚举值,所以通过反射去得到枚举数据.

(一) 首先我们新建一个枚举类接口,用于之后反射使用

package com.littlematch.enums.biz;

/**
 * 枚举值接口定义类
 */
public interface Constant {
    /**
     * 获取描述
     * @return
     */
    public String desc();

    /**
     * 获取值 int
     * @return
     */
    public int val();
}

(二) 接下来我们新建一个枚举类

用这种形式,可以将同业务类型的枚举归类在一起, 并且不会受到枚举类规则的限制

package com.littlematch.enums;

import com.littlematch.enums.biz.Constant;

/**
 * @ Description:
 * @ Author     :Match
 * @ Date       :上午 11:02 2018/11/28 0028
 * @Version: $version$
 */
public class SystemEnum {

    /**
     * 上架状态
     * @author :Match
     */
    public enum StatusEnum implements Constant {

        YES("是", 1),
        NO("否", 2);

        private String desc;
        private int value;
        StatusEnum(String desc, int value){
            this.desc = desc;
            this.value = value;
        }
        @Override
        public String desc() {
            return desc;
        }
        @Override
        public int val() {
            return value;
        }
    }
}

(三) 写个测试类测试能否拿到数据

这里是需要的参数为: 包名 + 类名
格式为:

包名:com.littlematch.enums.base
类名:SystemEnum.StatusEnum
package com.littlematch.utils;

import com.littlematch.enums.biz.Constant;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * @ Description:${description}
 * @ Author     :Match
 * @ Date       :下午 15:09 2018/12/12 0012
 * @Version: $version$
 */
public class Test {
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
    
        //需要的参数
        String enumType = "SystemEnum.StatusEnum";
        String[] enumArray =enumType.split("\\.");
        String enum2 =enumArray[1];
        // 这里需要完整的包名+类名,所以包名也需要提前知道
        String packageName = "com.littlematch.enums.base";
        Class<?> clazz1 = Class.forName(packageName+"."+enumArray[0]);
        Class<? extends Object> cl = clazz1.getClass();

        Class innerClazz[] = clazz1.getDeclaredClasses();
        //遍历内部类
        for (Class class1 : innerClazz) {
            //获取内部内的类名
            String simpleName = class1.getSimpleName();
            if (simpleName.equals(enum2)) {
                //判断类是不是枚举类
                if (class1.isEnum()) {
                    //反射获取枚举类
                    Class<Enum> clazz = (Class<Enum>) Class.forName(class1.getName());
                    //获取所有枚举实例
                    Enum[] enumConstants = clazz.getEnumConstants();
                    //根据方法名获取方法
                    Method val = clazz.getMethod("val");
                    Method desc = clazz.getMethod("desc");
                    for (Enum enum1 : enumConstants) {
                        //执行枚举方法获得枚举实例对应的值
                        Object invoke1 = val.invoke(enum1);
                        Object invoke2 = desc.invoke(enum1);
                         System.out.println(invoke1.toString()+":"+invoke2.toString());

                    }
                }
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java根据枚举名使用反射获取枚举值 的相关文章

随机推荐