枚举工具类
很多个枚举类都需要用到通过 value值 来获取对应的 name 值
最简单的方式是在每一个枚举类定义一个静态方法,遍历所有实例对象,根据传入的 value 值找到对应的 name 值
嗯… 有点不优雅
抽离出上面的逻辑,通过反射的方式做一个通用的工具类
- 传入所需要的枚举类的 class 对象和对应的 value 值
- 根据 class 对象获取该枚举类的所有枚举实例对象、getValue 方法对象、getName 方法对象
- 遍历枚举实例对象,分别执行该对象的getValue 方法 和 getName 方法
- 比较获得想要的 name
package com.czh.common.utils;
import org.apache.commons.lang3.StringUtils;
import java.lang.reflect.Method;
import java.util.Objects;
/**
* 枚举类的工具类
*
* @author
* @date 2/22/2024
*/
public class EnumUtils {
private static final String GET_NAME = "getName";
private static final String GET_VALUE = "getValue";
/**
* 通过传入枚举类的 class 对象,和属性值 value,获取对应 name 的值
* <p>此方法只适用于:</p>
* <p>1、该枚举类存在 getName方法 和 getValue方法</p>
* <p>2、通过 value 获取对应的 name 值,如果不存在就返回 null </p>
*
* @param value
* @param clazz 枚举类 class 对象
* @return
*/
public static String getNameByValue(String value,Class<? extends Enum<?>> clazz) {
String result = null;
if (StringUtils.isEmpty(value) || Objects.isNull(clazz)) {
return result;
}
Enum<?>[] enumConstants = clazz.getEnumConstants();
try {
Method nameMethod = clazz.getMethod(GET_NAME);
Method valueMethod = clazz.getMethod(GET_VALUE);
nameMethod.setAccessible(true);
valueMethod.setAccessible(true);
for (Enum<?> enumConstant : enumConstants) {
Object invoke = valueMethod.invoke(enumConstant);
if (value.equals(invoke)) {
result = (String) nameMethod.invoke(enumConstant);
break;
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return result;
}
}
测试一下
package org.example.enums;
/**
* 证件类型枚举类
*
* @author
* @date 2023/11/22
*/
public enum CertificateTypeEnum {
GENERIDENT("1","一代身份证"),
IDENTITY("2","二代身份证");
private String value;
private String name;
CertificateTypeEnum(String value, String name) {
this.value = value;
this.name = name;
}
public String getValue() {
return value;
}
public String getName() {
return name;
}
public static void main(String[] args) {
String homeretper = EnumUtils.getNameByValue("1", CertificateTypeEnum.class);
// 输出 “一代身份证”
System.out.println(homeretper);
}
}