关键方法:

/**
 * 值映射为枚举
 *
 * @param enumClass 枚举类
 * @param value     枚举值
 * @param method    取值方法
 * @param <E>       对应枚举
 * @return
 */
public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Method method) {
    E[] es = enumClass.getEnumConstants();
    for (E e : es) {
        Object evalue;
        try {
            method.setAccessible(true);
            evalue = method.invoke(e);
        } catch (IllegalAccessException | InvocationTargetException e1) {
            throw ExceptionUtils.mpe("Error: NoSuchMethod in {}.  Cause:", e, enumClass.getName());
        }
        if (value instanceof Number && evalue instanceof Number
                && new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
            return e;
        }
        if (Objects.equals(evalue, value)) {
            return e;
        }
    }
    return null;
}

测试枚举类:

@Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public enum StrEnum {
        TEST1("000","成功"), TEST2("999","失败"), TEST3("888","处理中");
        private String value;
        private String text;
    }
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public enum IntEnum {
        TEST1(0,"成功"), TEST2(1,"失败"), TEST3(2,"处理中");
        private int value;
        private String text;
    }
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public enum LongEnum {
        TEST1(0L,"成功"), TEST2(1L,"失败"), TEST3(2L,"处理中");
        private Long value;
        private String text;
    }
    @Getter
    @NoArgsConstructor
    @AllArgsConstructor
    public enum ReEnum {
        //成功SUCCESS
        SUCCESS("000", "成功", "000000", ""),
        // 新增项目
        FAIL700101("7001", "验证失败", "700101", "没有收到报文"),
        FAIL700102("7001", "验证失败", "700102", "传入参数不合法");

        private String code;
        private String text;
        private String subCode;
        private String subText;
    }

调用:

@Test
public void valueOf() throws NoSuchMethodException {
    IntEnum intEnum = EnumUtils.valueOf(IntEnum.class,2,IntEnum.class.getMethod("getValue"));
    System.out.println(intEnum);

    StrEnum strEnum = EnumUtils.valueOf(StrEnum.class,"999",StrEnum.class.getMethod("getValue"));
    System.out.println(strEnum.getText());

    LongEnum longEnum = EnumUtils.valueOf(LongEnum.class,2,LongEnum.class.getMethod("getValue"));
    System.out.println(longEnum);

    ReEnum reEnum = EnumUtils.valueOf(ReEnum.class,"700102",ReEnum.class.getMethod("getSubCode"));
    System.out.println(reEnum.getSubText());
}

附完整:

1、EnumUtils.java

package com.gomepay.gb.utils.enums;

import com.gomepay.gb.utils.ExceptionUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Objects;

/**
 * @author www.gomepay.com
 * @date 2020/1/19
 */
public class EnumUtils {
    /**
     * 值映射为枚举
     *
     * @param enumClass 枚举类
     * @param value     枚举值
     * @param method    取值方法
     * @param <E>       对应枚举
     * @return
     */
    public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Method method) {
        E[] es = enumClass.getEnumConstants();
        for (E e : es) {
            Object evalue;
            try {
                method.setAccessible(true);
                evalue = method.invoke(e);
            } catch (IllegalAccessException | InvocationTargetException e1) {
                throw ExceptionUtils.mpe("Error: NoSuchMethod in {}.  Cause:", e, enumClass.getName());
            }
            if (value instanceof Number && evalue instanceof Number
                    && new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
                return e;
            }
            if (Objects.equals(evalue, value)) {
                return e;
            }
        }
        return null;
    }
    /**
     * 根据value值获取enum对象
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> E getEnumByValue(final Class<E> enumClass,Object value) {
        try {
            return valueOf(enumClass,value,enumClass.getMethod("getValue"));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据value值获取text
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> String getTextByValue(final Class<E> enumClass,Object value) {
        E e = getEnumByValue(enumClass,value);
        Object evalue;
        Method method = null;
        try {
            method = enumClass.getMethod("getText");
            method.setAccessible(true);
            evalue = method.invoke(e);
        } catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
            throw ExceptionUtils.mpe("Error: NoSuchMethod in {}.  Cause:", e, enumClass.getName());
        }
        if (evalue != null) {
            return String.valueOf(evalue);
        }
        return null;
    }
    /**
     * 根据code值获取enum对象,如果code值相同,则获取第一个enum对象
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> E getEnumByCode(final Class<E> enumClass,Object value) {
        try {
            return valueOf(enumClass,value,enumClass.getMethod("getCode"));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据code值获取text,如果code值相同,则获取第一个enum对象的text
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> String getTextByCode(final Class<E> enumClass,Object value) {
        E e = getEnumByCode(enumClass,value);
        Object evalue;
        Method method = null;
        try {
            method = enumClass.getMethod("getText");
            method.setAccessible(true);
            evalue = method.invoke(e);
        } catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
            throw ExceptionUtils.mpe("Error: NoSuchMethod in {}.  Cause:", e, enumClass.getName());
        }
        if (evalue != null) {
            return String.valueOf(evalue);
        }
        return null;
    }
    /**
     * 根据code值获取enum对象
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> E getEnumBySubCode(final Class<E> enumClass,Object value) {
        try {
            return valueOf(enumClass,value,enumClass.getMethod("getSubCode"));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 根据code值获取text,如果code值相同,则获取第一个enum对象的text
     * @param enumClass
     * @param value
     * @param <E>
     * @return
     */
    public static <E extends Enum<E>> String getSubTextBySubCode(final Class<E> enumClass,Object value) {
        E e = getEnumBySubCode(enumClass,value);
        Object evalue;
        Method method = null;
        try {
            method = enumClass.getMethod("getSubText");
            method.setAccessible(true);
            evalue = method.invoke(e);
        } catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
            throw ExceptionUtils.mpe("Error: NoSuchMethod in {}.  Cause:", e, enumClass.getName());
        }
        if (evalue != null) {
            return String.valueOf(evalue);
        }
        return null;
    }
}
View Code

相关文章: