如何通过Java枚举类对象和字段名获取对应枚举绑定的数值
核心问题修正
你原有代码的foo2方法第一个参数类型定义错误:调用时传入的是枚举类的Class对象,因此参数不能定义为Enum类型,需要调整为Class类型。
方案一:推荐实现(无反射,性能更优)
首先定义公共的枚举编码接口,让所有业务枚举实现该接口统一规范取值:
// 公共编码枚举接口 public interface CodeEnum { int getCode(); }
调整你的枚举类实现该接口:
public enum ErrorCodes1 implements CodeEnum{ OK(0), NOT_EXIST_USER(1), FAIL_TO_SEND_MAIL(2); private final int code; // 原有构造方法 ErrorCodes1(int code){ this.code = code; } @Override public int getCode() { return this.code; } } // ErrorCodes2同理实现CodeEnum接口即可
修改foo2方法实现:
public void foo2(Class<? extends CodeEnum> enumClazz, String enumText) { // 根据字段名获取枚举实例 CodeEnum enumInstance = Enum.valueOf(enumClazz.asSubclass(Enum.class), enumText); // 直接获取绑定的整数值 int code = enumInstance.getCode(); // 后续处理逻辑 }
调用方式和你原有foo1中的写法完全兼容,无需调整。
方案二:无需修改原有枚举(反射实现)
如果不能改动原有枚举类的定义,可以通过反射直接读取枚举的属性值:
public void foo2(Class<? extends Enum<?>> enumClazz, String enumText) throws NoSuchFieldException, IllegalAccessException { // 根据字段名获取枚举实例 Enum<?> enumInstance = Enum.valueOf(enumClazz, enumText); // 反射读取code字段值,字段名和你枚举中定义的存储整数的属性名保持一致即可 Field codeField = enumClazz.getDeclaredField("code"); codeField.setAccessible(true); int code = codeField.getInt(enumInstance); // 后续处理逻辑 }
注意事项
- 传入的枚举字段名需要和枚举定义的名称完全匹配(大小写敏感),否则会抛出
IllegalArgumentException - 生产环境建议增加异常捕获逻辑,处理字段不存在、属性读取失败等边界场景
内容的提问来源于stack exchange,提问作者Kr_romio
相关产品推荐
相关产品推荐

