关键方法:

/**
* 值映射为枚举
*
* @param enumClass 枚举类
* @param value 枚举值
* @param method 取值方法
* @param <E> 对应枚举
* @return
*/
public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Method method) {
E[] es = enumClass.getEnumConstants();
for (E e : es) {
Object evalue;
try {
method.setAccessible(true);
evalue = method.invoke(e);
} catch (IllegalAccessException | InvocationTargetException e1) {
throw ExceptionUtils.mpe("Error: NoSuchMethod in {}. Cause:", e, enumClass.getName());
}
if (value instanceof Number && evalue instanceof Number
&& new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
return e;
}
if (Objects.equals(evalue, value)) {
return e;
}
}
return null;
}

测试枚举类:

@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum StrEnum {
TEST1("000","成功"), TEST2("999","失败"), TEST3("888","处理中");
private String value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum IntEnum {
TEST1(0,"成功"), TEST2(1,"失败"), TEST3(2,"处理中");
private int value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum LongEnum {
TEST1(0L,"成功"), TEST2(1L,"失败"), TEST3(2L,"处理中");
private Long value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ReEnum {
//成功SUCCESS
SUCCESS("000", "成功", "000000", ""),
// 新增项目
FAIL700101("7001", "验证失败", "700101", "没有收到报文"),
FAIL700102("7001", "验证失败", "700102", "传入参数不合法"); private String code;
private String text;
private String subCode;
private String subText;
}

调用:

@Test
public void valueOf() throws NoSuchMethodException {
IntEnum intEnum = EnumUtils.valueOf(IntEnum.class,2,IntEnum.class.getMethod("getValue"));
System.out.println(intEnum); StrEnum strEnum = EnumUtils.valueOf(StrEnum.class,"999",StrEnum.class.getMethod("getValue"));
System.out.println(strEnum.getText()); LongEnum longEnum = EnumUtils.valueOf(LongEnum.class,2,LongEnum.class.getMethod("getValue"));
System.out.println(longEnum); ReEnum reEnum = EnumUtils.valueOf(ReEnum.class,"700102",ReEnum.class.getMethod("getSubCode"));
System.out.println(reEnum.getSubText());
}

附完整:

1、EnumUtils.java

package com.gomepay.gb.utils.enums;

import com.gomepay.gb.utils.ExceptionUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.util.Objects; /**
* @author www.gomepay.com
* @date 2020/1/19
*/
public class EnumUtils {
/**
* 值映射为枚举
*
* @param enumClass 枚举类
* @param value 枚举值
* @param method 取值方法
* @param <E> 对应枚举
* @return
*/
public static <E extends Enum<?>> E valueOf(Class<E> enumClass, Object value, Method method) {
E[] es = enumClass.getEnumConstants();
for (E e : es) {
Object evalue;
try {
method.setAccessible(true);
evalue = method.invoke(e);
} catch (IllegalAccessException | InvocationTargetException e1) {
throw ExceptionUtils.mpe("Error: NoSuchMethod in {}. Cause:", e, enumClass.getName());
}
if (value instanceof Number && evalue instanceof Number
&& new BigDecimal(String.valueOf(value)).compareTo(new BigDecimal(String.valueOf(evalue))) == 0) {
return e;
}
if (Objects.equals(evalue, value)) {
return e;
}
}
return null;
}
/**
* 根据value值获取enum对象
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> E getEnumByValue(final Class<E> enumClass,Object value) {
try {
return valueOf(enumClass,value,enumClass.getMethod("getValue"));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据value值获取text
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> String getTextByValue(final Class<E> enumClass,Object value) {
E e = getEnumByValue(enumClass,value);
Object evalue;
Method method = null;
try {
method = enumClass.getMethod("getText");
method.setAccessible(true);
evalue = method.invoke(e);
} catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
throw ExceptionUtils.mpe("Error: NoSuchMethod in {}. Cause:", e, enumClass.getName());
}
if (evalue != null) {
return String.valueOf(evalue);
}
return null;
}
/**
* 根据code值获取enum对象,如果code值相同,则获取第一个enum对象
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> E getEnumByCode(final Class<E> enumClass,Object value) {
try {
return valueOf(enumClass,value,enumClass.getMethod("getCode"));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据code值获取text,如果code值相同,则获取第一个enum对象的text
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> String getTextByCode(final Class<E> enumClass,Object value) {
E e = getEnumByCode(enumClass,value);
Object evalue;
Method method = null;
try {
method = enumClass.getMethod("getText");
method.setAccessible(true);
evalue = method.invoke(e);
} catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
throw ExceptionUtils.mpe("Error: NoSuchMethod in {}. Cause:", e, enumClass.getName());
}
if (evalue != null) {
return String.valueOf(evalue);
}
return null;
}
/**
* 根据code值获取enum对象
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> E getEnumBySubCode(final Class<E> enumClass,Object value) {
try {
return valueOf(enumClass,value,enumClass.getMethod("getSubCode"));
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
/**
* 根据code值获取text,如果code值相同,则获取第一个enum对象的text
* @param enumClass
* @param value
* @param <E>
* @return
*/
public static <E extends Enum<E>> String getSubTextBySubCode(final Class<E> enumClass,Object value) {
E e = getEnumBySubCode(enumClass,value);
Object evalue;
Method method = null;
try {
method = enumClass.getMethod("getSubText");
method.setAccessible(true);
evalue = method.invoke(e);
} catch (NoSuchMethodException |IllegalAccessException | InvocationTargetException e1) {
throw ExceptionUtils.mpe("Error: NoSuchMethod in {}. Cause:", e, enumClass.getName());
}
if (evalue != null) {
return String.valueOf(evalue);
}
return null;
}
}

2、TestEnum3.java

package com.gomepay.enums;

import com.gomepay.gb.utils.enums.EnumUtils;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.junit.Test; /**
* @author www.gomepay.com
* @date 2020/1/20
*/
public class TestEnum3 {
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum StrEnum {
TEST1("000","成功"), TEST2("999","失败"), TEST3("888","处理中");
private String value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum IntEnum {
TEST1(0,"成功"), TEST2(1,"失败"), TEST3(2,"处理中");
private int value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum LongEnum {
TEST1(0L,"成功"), TEST2(1L,"失败"), TEST3(2L,"处理中");
private Long value;
private String text;
}
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum ReEnum {
//成功SUCCESS
SUCCESS("000", "成功", "000000", ""),
// 新增项目
FAIL700101("7001", "验证失败", "700101", "没有收到报文"),
FAIL700102("7001", "验证失败", "700102", "传入参数不合法"); private String code;
private String text;
private String subCode;
private String subText;
} /**
* 根据enum中的指定属性获取该enum对象
* @throws NoSuchMethodException
*/
@Test
public void valueOf() throws NoSuchMethodException {
IntEnum intEnum = EnumUtils.valueOf(IntEnum.class,2,IntEnum.class.getMethod("getValue"));
System.out.println(intEnum); StrEnum strEnum = EnumUtils.valueOf(StrEnum.class,"999",StrEnum.class.getMethod("getValue"));
System.out.println(strEnum.getText()); LongEnum longEnum = EnumUtils.valueOf(LongEnum.class,2,LongEnum.class.getMethod("getValue"));
System.out.println(longEnum); ReEnum reEnum = EnumUtils.valueOf(ReEnum.class,"700102",ReEnum.class.getMethod("getSubCode"));
System.out.println(reEnum.getSubText());
} /**
* 根据value值获取enum对象
*/
@Test
public void getEnumByValue() {
StrEnum strEnum = EnumUtils.getEnumByValue(StrEnum.class,"999");
System.out.println(strEnum);
} /**
* 根据value值获取text
*/
@Test
public void getTextByValue() {
String text = EnumUtils.getTextByValue(IntEnum.class,2);
System.out.println(text);
} /**
* 根据code值获取enum对象
*/
@Test
public void getEnumByCode() {
//获取到的是符合条件的第一个enum
ReEnum reEnum = EnumUtils.getEnumByCode(ReEnum.class,"7001");
System.out.println(reEnum);
} /**
* 根据code值获取text
*/
@Test
public void getTextByCode() {
//获取到的是符合条件的第一个enum
String text = EnumUtils.getTextByCode(ReEnum.class,"7001");
System.out.println(text);
} /**
* 根据subCode获取enum对象
*/
@Test
public void getEnumBySubCode() {
ReEnum reEnum = EnumUtils.getEnumBySubCode(ReEnum.class,"700102");
System.out.println(reEnum);
} /**
* 根据subCode获取text
*/
@Test
public void getSubTextBySubCode() {
String text = EnumUtils.getSubTextBySubCode(ReEnum.class,"700102");
System.out.println(text);
} }

---------------------------------------完毕。

另附:hutoool操作枚举工具方法

package com.gomepay.enums;

import cn.hutool.core.lang.Console;
import cn.hutool.core.util.EnumUtil;
import org.junit.Test; import java.util.List;
import java.util.Map; /**
* @author www.gomepay.com
* @date 2020/1/19
*/
public class TestEnum1 {
//定义枚举
public enum TestEnum{
TEST1("type1"), TEST2("type2"), TEST3("type3");
private TestEnum(String type) {
this.type = type;
}
private String type;
public String getType() {
return this.type;
}
} /**
* 获取枚举类中所有枚举对象的name列表
*/
@Test
public void test1() {
List<String> names = EnumUtil.getNames(TestEnum.class);
//输出:[TEST1, TEST2, TEST3]
Console.log(names);
} /**
* 获得枚举类中各枚举对象下指定字段的值
*/
@Test
public void test2() {
List<Object> types = EnumUtil.getFieldValues(TestEnum.class, "type");
//输出:[type1, type2, type3]
Console.log(types);
} /**
* 获取枚举字符串值和枚举对象的Map对应,使用LinkedHashMap保证有序,结果中键为枚举名,值为枚举对象
*/
@Test
public void test3() {
Map<String,TestEnum> enumMap = EnumUtil.getEnumMap(TestEnum.class);
TestEnum t = enumMap.get("TEST1");
//输出:TEST1对象
Console.log(t);
} /**
* 获得枚举名对应指定字段值的Map,键为枚举名,值为字段值
*/
@Test
public void test4() {
Map<String, Object> enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type");
String type = (String)enumMap.get("TEST2");
//输出:type2
Console.log(type);
}
}

java 根据值获取枚举对象的更多相关文章

  1. 第三章 EnumUtil根据值获取枚举对象

    项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...

  2. java反射之获取枚举对象

    项目中导入大量枚举对象,用来定义常量.随着带来一个问题,就是每个枚举类都需要通过key来获取对应枚举的需求. public enum ExamType { CRAFT(1, "草稿" ...

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

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

  4. java根据url获取json对象

    package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; ...

  5. java webservice服务器端获取request对象的三种方式

    有的时候在webservice里我们需要获取request对象和response对象,比如想要获得客户端的访问ip的时候就需要这么做,下面说三种方式,当然三种方式可能是针对不同方式部署webservi ...

  6. java 反射之获取泛型对象的所有字段与对应的值(包括父类的)

    上代码: public static void main(String[] args) throws IntrospectionException { SysUser obj = new SysUse ...

  7. Java反射机制(获取Class对象的三种方式+获取Class中的构造函数进行对象的初始化+获取反射类的字段+获取反射类的一般方法)

    反射技术其实就是动态加载一个指定的类,并获取该类中的所有内容.而且将字节码文件封装成对象,并将字节码文件中的内容都封装成对象,这样便于操作这些成员,简单来说:反射技术可以对一个类进行解剖,反射大大增强 ...

  8. H5_0017:通过元素自定义属性值获取元素对象,并获取属性值

            // 通过元素的属性值查找对象         // document.querySelectorAll("[data]").forEach(function(e) ...

  9. js通过值获取数组对象对应下标

    var nn = [ { a: 'ss' },{ a: 'aa' },{ a : '11'},{ a: '33' },{ a: '88' } ] 我要怎么获取 a = 33的下标 var index ...

随机推荐

  1. 【PAT甲级】1022 Digital Library (30 分)(模拟)

    题意: 输入一个正整数N(<=10000),接下来输入N组数据,ID,书名,作者,关键词,出版社,出版年份. 然后输入一个正整数M(<=1000),接下来输入查询的数据,递增输出ID,若没 ...

  2. MySQL的默认隔离级别的实现依赖于MVCC和锁,准确点说就是一致性读和锁。

    MySQL的默认隔离级别的实现依赖于MVCC和锁,准确点说就是一致性读和锁.

  3. [aac @ ...] more samples than frame size (avcodec_encode_audio2)

    在用FFmpeg对音频进行编码的时候报如下错误: [aac @ 000001cfc2717200] more samples than frame size (avcodec_encode_audio ...

  4. i.MX RT600之DMIC外设介绍及应用

    恩智浦的i.MX RT600是跨界处理器产品,同样也是i.MX RTxxx系列的开山之作.不同于i.MX RT1xxx系列单片机,i.MX RT600 采用了双核架构,将新一代Cortex-M33内核 ...

  5. HTML<video></video>视频无法自动播放

    1.video 标签属性 src: 设置显示视频路径 controls: 显示控制栏 loop: 控制视频循环播放 autoplay: 自动播放 muted:设置静音播放 2.解决视频或音频标签自动播 ...

  6. 【Linux shell】 while read line

    循环中的重定向或许你应该在其他脚本中见过下面的这种写法:while read linedo …done < file刚开始看到这种结构时,很难理解< file是如何与循环配合在一起工作的. ...

  7. android EditText中inputType的属性列表

    android 1.5以后添加了软件虚拟键盘的功能,所以在输入提示中将会有对应的软键盘模式 android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用.这也大大 ...

  8. rapid-generator JAVA代码生成器

    有感于马上要做个比较大的业务系统,想到那无止境的增删改查.粘贴复制,顿时脑后升起一阵凉风.于是想到个找或者写一个Java代码的生成器,这样在正常开发进度下,也能余下更多的时间去做些别的事情. 闲话少说 ...

  9. (编辑状态下)Reset及OnValidate使用

    using UnityEngine; using System.Collections; public class Demo : MonoBehaviour { #if UNITY_EDITOR vo ...

  10. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:宠物商店实例分析

    interface Pet{ // 定义宠物接口 public String getName() ; public String getColor() ; public int getAge() ; ...