這是一個枚舉工具類,有時候一個枚舉自身爲空,咱們程序在調用他的方法時(如: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數據;