枚举工具类 EnumUtils
这是一个枚举工具类,有时候一个枚举自身为空,我们程序在调用他的方法时(如: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的更多相关文章
- 根据值获取枚举类对象工具类EnumUtils
枚举类 public enum Sex { man("M","男"),woman("W","女"); private S ...
- 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类
关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...
- JS 工具类
之前工作用的JavaScript比较多,总结了一下工具类,和大家分享一下,有不足之处还请多多见谅!! 1. 数组工具类(arrayUtils) var arrayUtils = {}; (functi ...
- commons-lang3工具类学习(二)
三.BooleanUtils 布尔工具类 and(boolean... array) 逻辑与 BooleanUtils.and(true, true) = true Boolea ...
- 枚举处理工具类 .net
将枚举转化成List<T>的方法如下: /// <summary> /// 枚举处理工具类 /// </summary> public class EnumHelp ...
- 如何在类中根据枚举值,获取枚举的message的工具类
枚举类为: public enum OrderStatusEnum implements CondeEnum{ NEW(0, "新订单"), FINISHED(1, "完 ...
- .net工具类 获取枚举类型的描述
一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述. 为了方便获取这些信息,就封装了一个枚举扩展类. /// <summary> /// ...
- Java 中节省 90% 时间的常用的工具类
前言 你们有木有喜欢看代码的领导啊,我的领导就喜欢看我写的代码,有事没事就喜欢跟我探讨怎么写才最好,哈哈哈...挺好. 今天我们就一起来看看可以节省 90% 的加班时间的第三方开源库吧,第一个介绍的必 ...
- DNS枚举工具DNSenum
DNS枚举工具DNSenum DNSenum是一款非常强大的域名信息收集工具.它能够通过谷歌或者字典文件猜测可能存在的域名,并对一个网段进行反向查询.它不仅可以查询网站的主机地址信息.域名服务器. ...
随机推荐
- FPGA选型
工欲善其事必先利其器,开发FPGA的第一步,当然是选择一片符合你设计需求的芯片. 但是芯片种类那么多,老板又要你越省越好,硬件工程师也天天问你到底该用哪块芯片,怎么办? 今天正好可以跟大家聊聊这些问题 ...
- Scrum立会报告+燃尽图(Beta阶段第七次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2388 项目地址:https://coding.net/u/wuyy694 ...
- HDU 5646 DZY Loves Partition
题目链接: hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646 bc:http://bestcoder.hdu.edu.cn/contests/con ...
- Notepad++如何多视图(分屏)显示
Notepad++ v6.6.7 当需要同时查阅或者编辑多个文件时,正是多视图功能大显身手的时候. 可以在你想要在另一边预览操作的文件名字(在工具栏和文件内容之间)上,单击右键,如下图所示,选择移动到 ...
- VC++中使用用户自定义消息及自定制窗口技巧
Windows 应用程序所要做的每项工作几乎都是基于消息处理的, Windows 系统消息分为常用 Windows 消息,控件通知消息和命令.然而,有时我们需要定义自己的消息来通知程序什么事情发生了, ...
- 【week10】psp
项目 内容 开始时间 结束时间 中断时间 净时间 2016/11/19(星期六) 写博客 吉林一日游规格说明书 10:30 15:10 20 260 2016/11/20(星期日) 看论文 磷酸化+三 ...
- centos系统下禁用笔记本触控板
最近把零几年的老爷笔记本拿出来用,使用windows系统实在太卡了,于是折腾安装上Centos系统了,但是在使用的过程中发现鼠标经常失效.使用了多种方法(比如:http://blog.csdn.net ...
- json_decode遇到的编码问题
初入csdn,就最近遇到的简单问题做一个功能解释; json_encode和json_decode只针对utf8字符有效,如果遇到其他编码比如gbk,需要进行转码然后解析: header(" ...
- hdu-题目:1058 Humble Numbes
http://acm.hdu.edu.cn/showproblem.php?pid=1058 Problem Description A number whose only prime factors ...
- 在DbGrid中,不按下Ctrl,单击鼠标如何实现多选?谢谢
解决方案 » 有了dbgrid1.options.dgmultiselect:=true;必须按下Ctrl键,才能实现多选, 修改源代码,把以下内容if Select and (ssShift i ...