枚举工具类 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是一款非常强大的域名信息收集工具.它能够通过谷歌或者字典文件猜测可能存在的域名,并对一个网段进行反向查询.它不仅可以查询网站的主机地址信息.域名服务器. ...
随机推荐
- 提升Android ListView性能的几个技巧
ListView如何运作的? ListView是设计应用于对可扩展性和高性能要求的地方.实际上,这就意味着ListView有以下2个要求: 尽可能少的创建View: 只是绘制和布局在屏幕上可见的子Vi ...
- vue+vue-video-player实现弹窗播放视频
将视频播放器标签放在对话框标签中,实现弹窗 template 中 <el-dialog :visible.sync="dialogVisible" width='680px' ...
- DP---(POJ1159 POJ1458 POJ1141)
POJ1159,动态规划经典题目,很适合初学者入门练手. 求:为了使字符串左右对称,应该插入的最小字符数目. 设字符串为S1 S2 S3 - Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题 ...
- App接口如何保证安全
微信开发或者高德地图,百度地图什么的api要使用,使用之前都需要注册一个账号,然后系统会给你一个key,然后调用api的时候把key传给服务器. 平常公司内部开发项目时,直接用mvc为app客户端提供 ...
- Qt使用QNetworkAccessManager实现Ftp操作
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt使用QNetworkAccessManager实现Ftp操作 本文地址:http: ...
- PHP中is_null()方法
is_null — 检测变量是否为 NULL bool is_null ( mixed $var ) 如果 var 是 null 则返回 TRUE,否则返回 FALSE. 举例: $x=" ...
- P2610 [ZJOI2012]旅游
题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个凸N边形来表示,N个顶点表示N个入境/出 ...
- 2月24日考试——ZYYS
LSGJ zyys 战队的 CYA 小垃圾,被各位神佬出的题目搞得心态爆炸.于是他模仿了蔡老师给了你两个整数 n 和 m .让你计算字母表大小为 m ,(即可用 m 个字母)长度为 n ,不存在长度至 ...
- 拓展kmp总结
借鉴自:https://blog.csdn.net/dyx404514/article/details/41831947 定义母串S,和子串T,设S的长度为n,T的长度为m,求T与S的每一个后缀的最长 ...
- Android APK 反编译步骤
dex2jar和jd-gui工具下载,链接:http://yun.baidu.com/share/link?shareid=2888715259&uk=1377615098 解压APK文件得到 ...