Java uses reflection to obtain enumeration values based on enumeration names

Since the front end needs to obtain the enumeration value in real time according to the enumeration name, the enumeration data is obtained through reflection.

(1) First, we create a new enumeration class interface for later reflection use

package com.littlematch.enums.biz;

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

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

(2) Next, we create a new enumeration class

In this form, enumerations of the same business type can be grouped together without being restricted by enumeration class rules

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;
        }
    }
}

(3) Write a test class to test whether the data can be obtained

Here are the required parameters: package name + class name
format:

包名: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());

                    }
                }
            }
        }
    }
}

Guess you like

Origin blog.csdn.net/Little_Matches/article/details/84977454