Java usa la reflexión para obtener valores de enumeración basados en nombres de enumeración

Dado que el front-end necesita obtener el valor de enumeración en tiempo real según el nombre de enumeración, los datos de enumeración se obtienen a través de la reflexión.

(1) Primero, creamos una nueva interfaz de clase de enumeración para su posterior uso de reflexión

package com.littlematch.enums.biz;

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

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

(2) A continuación, creamos una nueva clase de enumeración

De esta forma, las enumeraciones del mismo tipo de empresa se pueden agrupar sin estar restringidas por las reglas de clase de enumeración.

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) Escriba una clase de prueba para comprobar si se pueden obtener los datos

Aquí están los parámetros requeridos: nombre del paquete +
formato del nombre de la clase:

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

                    }
                }
            }
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/Little_Matches/article/details/84977454
Recomendado
Clasificación