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

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

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

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());

                    }
                }
            }
        }
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值