枚舉工具類 EnumUtils

這是一個枚舉工具類,有時候一個枚舉自身爲空,咱們程序在調用他的方法時(如:name(),ordinal()),就會報空指針異常;下面寫這個工具類就是爲了來避免這些問題的,有些外部引用的沒有貼出來,不過都是些挺簡單的工具代碼;java

代碼以下:spring

/*
 * Copyright 2014-2018 xfami.cn. All rights reserved.
 * Support: https://www.xfami.cn
 */
package com.cymc.page.common.enumobj;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;

import com.cymc.page.admin.autocar.enums.param.AutoCarInteriorColorEnum;
import com.cymc.page.common.CommonAttrs;
import com.cymc.page.common.CommonUtil;
import com.cymc.page.utils.SpringUtils;

/**
 * Utils - 枚舉工具
 * 
 * @author XFaMi Team
 * @version 1.0
 * @CreateDate 2018-1-16 下午2:41:41
 */
public class EnumUtils {
    
    public final static String CLASS_NAME_ENUM = "Enum";
    
    private final static String METHOD_GET = "get";
    
    private EnumUtils() {
    }
    
    public static void main(String[] args) {
        //getEnumJsonBean(AutoCarInteriorColorEnum.class, "nihao");
        //System.out.println(enumToMap(AutoCarInteriorColorEnum.class, null));
        //AutoCarInteriorColorEnum c = null;
        System.out.println(getEnumPropMap(AutoCarInteriorColorEnum.beige));
        //System.out.println(getEnumOrdinal(AutoCarInteriorColorEnum.red));
    }
    
    /**
     * 獲取枚舉 getLabel(獲取中文翻譯)方法的返回值
     *     此方法去調用枚舉中的'getLabel'方法
     * @param e 若是爲null 返回空字符串""
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static String getLabel(Enum e) {
        if (e == null) {
            return StringUtils.EMPTY;
        }

        try {
            Method method = e.getClass().getMethod("getLabel");
            return (String) method.invoke(e);
        } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e1) {
            e1.printStackTrace();
        }

        return StringUtils.EMPTY;
    }
    
    /**
     * 獲取枚舉 getLabel(獲取中文翻譯)方法的返回值
     *     此方法直接獲取account_zh_CN.properties配置文件中的翻譯
     * @param e 若是爲null 返回空字符串""
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static String getLabelV2(Enum e) {
        if (e == null) {
            return StringUtils.EMPTY;
        }
        return SpringUtils.getMessage(e.getClass().getSimpleName().replace(EnumUtils.CLASS_NAME_ENUM, StringUtils.EMPTY)
                + CommonAttrs.SPLITTER_SPOT + e.name());
    }
    
    /**
     * 獲取枚舉下標,若是枚舉爲null,也返回null
     * @param e
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Integer getEnumOrdinal(Enum e) {
        if (e == null) {
            return null;
        }
        return e.ordinal();
    }
    
    /**
     * 獲取枚舉屬性 及對應值
     * @param ordinal
     * @param clazz
     * @return
     */
    public static <T> Map<String, Object> getEnumMapByOrdinal(Integer ordinal, Class<T> clazz) {
        if (ordinal == null || clazz == null || !clazz.isEnum()) {
            return null;
        }
        
        Map<String, Object> data = new HashMap<String, Object>();
        // 獲取 枚舉的屬性字段 和 get方法
        Map<String, String> propData = new HashMap<String, String>();
        for (Field field : clazz.getDeclaredFields()) {
            if (field.getModifiers() == 2 || field.getModifiers() == 18) {
                propData.put(field.getName(), METHOD_GET + CommonUtil.firstLetterUpper(field.getName()));
            }
        }

        T obj = clazz.getEnumConstants()[ordinal];
        data.put("ordinal", ordinal);
        data.put("name", obj.toString());
        for (Map.Entry<String, String> entry : propData.entrySet()) {
            try {
                Method method = clazz.getMethod(entry.getValue());
                data.put(entry.getKey(), method.invoke(obj));
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
                    | SecurityException e) {
                e.printStackTrace();
            }
        }
        return data;
    }
    
    /**
     * 獲取枚舉屬性 及對應值
     * @param en
     * @return
     */
    @SuppressWarnings("rawtypes")
    public static Map<String, Object> getEnumPropMap(Enum en) {
        if (en == null) {
            return null;
        }

        // 獲取 枚舉的屬性字段 和 get方法
        Map<String, String> propData = new HashMap<String, String>();
        for (Field field : en.getClass().getDeclaredFields()) {
            if (field.getModifiers() == 2 || field.getModifiers() == 18) {
                propData.put(field.getName(), METHOD_GET + CommonUtil.firstLetterUpper(field.getName()));
            }
        }
        // 單獨處理 getLabel 方法
        for (int i = 0; i < en.getClass().getInterfaces().length; i++) {
            Class<?> s = en.getClass().getInterfaces()[i];
            if (s.equals(EnumsLabelInterface.class) || s.equals(EnumsCodeInterface.class)) {
                propData.put("label", "getLabel");
            }
        }

        Map<String, Object> data = new HashMap<String, Object>();
        data.put("ordinal", en.ordinal());
        data.put("name", en.name());
        for (Map.Entry<String, String> entry : propData.entrySet()) {
            try {
                Method method = en.getClass().getMethod(entry.getValue());
                data.put(entry.getKey(), method.invoke(en));
            } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
                    | SecurityException e) {
                e.printStackTrace();
            }
        }
        return data;
    }

    @Deprecated
    public static <T> EnumJsonBean getEnumJsonBean(Class<T> clazz, String enumObjLabel) {
        Assert.notNull(clazz);
        String sname = clazz.getSimpleName().replace(CLASS_NAME_ENUM, StringUtils.EMPTY);
        sname = CommonUtil.toLowerCaseFirstOne(sname);
        return getEnumJsonBean(clazz, sname, enumObjLabel);
    }
    
    
    /**
     * 
     * @param clazz
     * @param enumObjName
     * @param enumObjLabel
     * @return
     */
    @Deprecated
    public static <T> EnumJsonBean getEnumJsonBean(Class<T> clazz, String enumObjName, String enumObjLabel) {
        Assert.hasText(enumObjName);
        Assert.hasText(enumObjLabel);
        Assert.notNull(clazz);
        if (!clazz.isEnum()) {
            return null;
        }

        // 獲取 枚舉的屬性字段 和 get方法
        Map<String, String> propData = new HashMap<String, String>();
        for (Field field : clazz.getDeclaredFields()) {
            if (field.getModifiers() == 2 || field.getModifiers() == 18) {
                propData.put(field.getName(), METHOD_GET + CommonUtil.firstLetterUpper(field.getName()));
            }
        }
        // 單獨處理 getLabel 方法
        for (int i = 0; i < clazz.getInterfaces().length; i++) {
            Class<?> s = clazz.getInterfaces()[i];
            if (s.equals(EnumsLabelInterface.class) || s.equals(EnumsCodeInterface.class)) {
                propData.put("label", "getLabel");
            }
        }

        // 生成EnumJsonBean
        EnumJsonBean enumJson = new EnumJsonBean(enumObjName, enumObjLabel);
        T[] objs = clazz.getEnumConstants();
        for (int i = 0; i < objs.length; i++) {
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("ordinal", i);
            data.put("name", objs[i].toString());
            for (Map.Entry<String, String> entry : propData.entrySet()) {
                try {
                    Method method = clazz.getMethod(entry.getValue());
                    data.put(entry.getKey(), method.invoke(objs[i]));
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
                    e.printStackTrace();
                }
            }
            enumJson.getItems().add(data);
        }
        return enumJson;
    }
    
    /**
     * 將枚舉對象轉爲 map對象
     * @param clazz
     * @param enumObjName
     * @param enumObjLabel
     * @param srcData
     * @return
     */
    public static <T> Map<String, Object> enumToMap(Class<T> clazz, Map<String, Object> srcData) {
        Assert.notNull(clazz);
        if (!clazz.isEnum()) {
            return null;
        }
        if (srcData == null) {
            srcData = new HashMap<>();
        }
        // 生成map Key
        String sname = clazz.getSimpleName().replace(CLASS_NAME_ENUM, StringUtils.EMPTY);
        sname = CommonUtil.toLowerCaseFirstOne(sname);

        // 放值
        srcData.put(sname, getEnumValues(clazz));
        return srcData;
    }
    
    
    /**
     * 獲取枚舉全部值的屬性
     * @param clazz
     * @return
     */
    public static <T> List<Map<String, Object>> getEnumValues(Class<T> clazz) {
        Assert.notNull(clazz);
        if (!clazz.isEnum()) {
            return null;
        }

        // 獲取 枚舉的屬性字段 和 get方法
        Map<String, String> propData = new HashMap<String, String>();
        for (Field field : clazz.getDeclaredFields()) {
            if (field.getModifiers() == 2 || field.getModifiers() == 18) {
                propData.put(field.getName(), METHOD_GET + CommonUtil.firstLetterUpper(field.getName()));
            }
        }
        // 單獨處理 getLabel 方法
        for (int i = 0; i < clazz.getInterfaces().length; i++) {
            Class<?> s = clazz.getInterfaces()[i];
            if (s.equals(EnumsLabelInterface.class) || s.equals(EnumsCodeInterface.class)) {
                propData.put("label", "getLabel");
            }
        }

        // 生成map value
        List<Map<String, Object>> dataList = new ArrayList<>();
        T[] objs = clazz.getEnumConstants();
        for (int i = 0; i < objs.length; i++) {
            Map<String, Object> data = new HashMap<String, Object>();
            data.put("ordinal", i);
            data.put("name", objs[i].toString());
            for (Map.Entry<String, String> entry : propData.entrySet()) {
                try {
                    Method method = clazz.getMethod(entry.getValue());
                    data.put(entry.getKey(), method.invoke(objs[i]));
                } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException
                        | SecurityException e) {
                    e.printStackTrace();
                }
            }
            dataList.add(data);
        }

        return dataList;
    }
    
    /**
     * 經過Class獲取枚舉對象EnumObjBean
     *     棄用
     * @param clazz
     * @param enumObjName
     * @param enumObjLabel
     * @return
     */
    @Deprecated
    public static EnumObjBean getEnumObjBean(Class<?> clazz, String enumObjName, String enumObjLabel) {
        Assert.hasText(enumObjName);
        Assert.hasText(enumObjLabel);
        Assert.notNull(clazz);
        EnumObjBean enumObj = new EnumObjBean(enumObjName, enumObjLabel);
        Object[] objs = clazz.getEnumConstants();
        for (int i = 0; i < objs.length; i++) {
            // System.out.println(i + objs[i].toString());
//            EnumBean bean = new EnumBean(i, objs[i].toString(), SpringUtils.getMessage("CarParm."
//                    + CommonUtil.firstLetterUpper(enumObjName) + CommonAttrs.SPLITTER_SPOT + objs[i].toString()));
             EnumBean bean = new EnumBean(i, objs[i].toString(), "中文意思");
            enumObj.getEnums().add(bean);
        }
        return enumObj;
    }

    /**
     * 經過下標 獲取枚舉
     * @param <T>
     * 
     * @param clazz
     * @param ordinal
     * @return
     */
    public static <T> T getEnumByOrdinal(Class<T> clazz, Integer ordinal) {
        if (clazz == null || ordinal == null || !clazz.isEnum()) {
            return null;
        }
        T[] objs = (T[]) clazz.getEnumConstants();
        if (ordinal < 0 || ordinal >= objs.length) {
            return null;
        }
        return objs[ordinal];
    }
    
    /**
     * 經過code 獲取枚舉
     *     枚舉必須有code值,枚舉類必須有getCode()方法
     *     不建議使用
     * @param clazz
     * @param code
     * @return
     */
    public static <T> T getEnumByCode(Class<T> clazz, String code) {
        if (clazz == null || StringUtils.isBlank(code) || !clazz.isEnum()) {
            return null;
        }

        T[] objs = (T[]) clazz.getEnumConstants();
        for (int i = 0; i < objs.length; i++) {
            try {
                Method m = clazz.getMethod("getCode");
                if (code.equals(m.invoke(objs[i]))) {
                    return objs[i];
                }
            } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }
    
    /**
     * 經過code 獲取枚舉
     *     枚舉必須有code值,枚舉類必須有getCode()方法
     *     不建議使用
     * @param clazz
     * @param code
     * @return
     */
    public static <T> T getEnumByCode(Class<T> clazz, Integer code) {
        if (clazz == null || code == null || !clazz.isEnum()) {
            return null;
        }

        T[] objs = (T[]) clazz.getEnumConstants();
        for (int i = 0; i < objs.length; i++) {
            try {
                Method m = clazz.getMethod("getCode");
                if (code == m.invoke(objs[i])) {
                    return objs[i];
                }
            } catch (NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
                e.printStackTrace();
                return null;
            }
        }
        return null;
    }
}

 代碼中apache

  CommonAttrs.SPLITTER_SPOT = 「.」json

  CommonUtil.firstLetterUpper(xxx) 字符串首字母 轉大寫ide

    /**
     * 字符串首字母 轉大寫
     * @param str
     * @return
     */
    public static String firstLetterUpper(String str) {
        Assert.hasText(str);
        char[] ch = str.toCharArray();
        if (ch[0] >= 'a' && ch[0] <= 'z') {
            ch[0] = (char) (ch[0] - 32);
        }
        return String.valueOf(ch);
    }

 CommonUtil.toLowerCaseFirstOne(xxx)  首字母轉小寫工具

 

測試補充代碼:測試

/*
 * Copyright 2014-2018 xfami.cn. All rights reserved.
 * Support: https://www.xfami.cn
 */
package com.cymc.page.admin.autocar.enums.param;

import com.cymc.page.common.enumobj.EnumsLabelInterface;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * Enum - 內飾顏色
 * 
 * @author XFaMi Team
 * @version 1.0
 * @CreateDate 2018-1-12 下午5:21:13
 */
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum AutoCarInteriorColorEnum implements EnumsLabelInterface {

    /** 米黃 */
    beige("米黃", "#f7eed5"),

    /** 米灰 */
    griege("米灰", "#cccccc"),

    /** 紅色 */
    red("紅色", "#ec111a"),

    /** 黑色 */
    black("黑色", "#000000"),

    /** 棕色 */
    brown("棕色", "#724623"),

    /** 其餘 */
    other("其餘", "#ffffff"), ;

    /** 中文標記 */
    private final String label;

    /** 顏色值 */
    private final String value;

    private AutoCarInteriorColorEnum(String label, String value) {
        this.label = label;
        this.value = value;
    }

    @Override
    public String getLabel() {
        return label;
    }

    public String getValue() {
        return value;
    }
    
    @JsonProperty("name")
    public String getName(){
        return name();
    }
    
    @JsonProperty("ordinal")
    public int getOrdinal(){
        return ordinal();
    }

}
@JsonFormat 是SpringMVC jackson的註解,爲了方便將@ResponseBody返回枚舉對象是一個map鍵值對類型的json數據;
相關文章
相關標籤/搜索