这是一个枚举工具类,有时候一个枚举自身为空,我们程序在调用他的方法时(如:name(),ordinal()),就会报空指针异常;下面写这个工具类就是为了来避免这些问题的,有些外部引用的没有贴出来,不过都是些挺简单的工具代码;

代码如下:

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

代码中

  CommonAttrs.SPLITTER_SPOT = “.”

  CommonUtil.firstLetterUpper(xxx) 字符串首字母 转大写

    /**
* 字符串首字母 转大写
* @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数据;

枚举工具类 EnumUtils的更多相关文章

  1. 根据值获取枚举类对象工具类EnumUtils

    枚举类 public enum Sex { man("M","男"),woman("W","女"); private S ...

  2. 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类

    关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...

  3. JS 工具类

    之前工作用的JavaScript比较多,总结了一下工具类,和大家分享一下,有不足之处还请多多见谅!! 1. 数组工具类(arrayUtils) var arrayUtils = {}; (functi ...

  4. commons-lang3工具类学习(二)

    三.BooleanUtils 布尔工具类 and(boolean... array) 逻辑与 BooleanUtils.and(true, true)         = true    Boolea ...

  5. 枚举处理工具类 .net

    将枚举转化成List<T>的方法如下: /// <summary> /// 枚举处理工具类 /// </summary> public class EnumHelp ...

  6. 如何在类中根据枚举值,获取枚举的message的工具类

    枚举类为: public enum OrderStatusEnum implements CondeEnum{ NEW(0, "新订单"), FINISHED(1, "完 ...

  7. .net工具类 获取枚举类型的描述

    一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary> /// ...

  8. Java 中节省 90% 时间的常用的工具类

    前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...

  9. DNS枚举工具DNSenum

    DNS枚举工具DNSenum   DNSenum是一款非常强大的域名信息收集工具.它能够通过谷歌或者字典文件猜测可能存在的域名,并对一个网段进行反向查询.它不仅可以查询网站的主机地址信息.域名服务器. ...

随机推荐

  1. win10与linux双系统切换时间不一致的调整

    按照Linux系统之后再切换回到win10后,我发现win10的时间不再是北京时间,而是比北京时间多了整整8小时,之后百度找到了问题来源,这里给出解决方法. 如果安装了 Windows 和 Linux ...

  2. 2017软工第十周个人PSP

    11.17--11.23本周例行报告 1.PSP(personal software process )个人软件过程. C(类别) C(内容) ST(开始时间) ET(结束时间) INT(间隔时间) ...

  3. 使用coding.net上传项目

    鉴于上一次上传托管代码的惨烈教训,痛定思痛,决定把这次使用cooding.net上传的过程记录下来.也算是一篇简单的cooding初级使用教程了. 1.首先在cooding上新建项目 (1)填写项目名 ...

  4. web.py 中文模版报错

    1. 作为模板的html文件,必须是utf-8编码; 2. html文件内容中的charset必须为utf-8,也就是必须包含 <meta http-equiv="Content-Ty ...

  5. mysql中(存储)函数

    (存储)函数: 函数,也说成“存储函数”,其实就是js或php中所说的函数! 唯一的区别: 这里的函数必须返回一个数据(值): 定义形式: 注意事项: 1, 在函数内部,可以有各种变量和流程控制的使用 ...

  6. angular 延迟更新方法

    失去焦点后更新: <input ng-model="name" ng-model-options="{updateOn:'blur'}" />{{n ...

  7. p12转pem公钥私钥

    cer格式证书生成p12文件,前面写了有一篇了. 这里是从p12文件导出公钥和私钥 //1.生成1.key文件 openssl pkcs12 -in apple_payment.p12 -nocert ...

  8. 洛谷 P1987 摇钱树

    题目戳 题目描述 Cpg 正在游览一个梦中之城,在这个城市中有n棵摇钱树...这下,可让Cpg看傻了...可是Cpg只能在这个城市中呆K天,但是现在摇钱树已经成熟了,每天每棵都会掉下不同的金币(不属于 ...

  9. 🔺Count on a tree SPOJ - COT (无能为力。。。)

    https://cn.vjudge.net/problem/SPOJ-COT 插上 大佬的代码 和 我的...以后再看吧... Count on a tree 大佬:http://www.cnblog ...

  10. 【刷题】LOJ 6041 「雅礼集训 2017 Day7」事情的相似度

    题目描述 人的一生不仅要靠自我奋斗,还要考虑到历史的行程. 历史的行程可以抽象成一个 01 串,作为一个年纪比较大的人,你希望从历史的行程中获得一些姿势. 你发现在历史的不同时刻,不断的有相同的事情发 ...