java中获取枚举常量最推荐调用class.getenumconstants(),它安全返回t[]数组;也可反射调用编译器生成的public static values()方法;还可通过name()、ordinal()及反射字段获取常量详情。

Java 中可以通过反射获取枚举类中所有常量值,核心是调用枚举类的静态方法 values(),该方法由编译器自动插入,返回一个包含所有枚举常量的数组。
直接调用 values() 方法(推荐)
这是最简单、最安全的方式,前提是已知枚举类的 Class 对象:
- 使用
clazz.getEnumConstants():直接返回枚举常量数组,类型为T[](泛型),若非枚举类则返回null - 或通过反射调用
values()静态方法:需注意方法无参、返回数组、修饰符为 public static
示例:
public static <t extends enum>> T[] getEnumValues(Class<t> enumClass) {
return enumClass.getEnumConstants();
}
// 使用
Color[] colors = getEnumValues(Color.class); // Color 是枚举类
</t></t>
通过反射调用 values() 方法(动态场景)
当只有 Class 对象且不确定是否为枚举(如泛型擦除后),可手动反射调用:
- 检查
clazz.isEnum()确保是枚举类型 - 用
clazz.getDeclaredMethod("values")获取方法,无需参数 - 调用
method.invoke(null)(静态方法,实例传 null) - 强转结果为
Object[],再按需转换为具体枚举类型数组
注意:values() 是编译器生成的 public static 方法,无需 setAccessible(true)。
获取常量名和字段信息
如果还需访问每个常量的名称、序号或自定义字段:
-
enumConstant.name()获取声明名(如RED) -
enumConstant.ordinal()获取序号(从 0 开始) - 通过
enumConstant.getClass().getDeclaredFields()可读取枚举实例的私有字段(需 setAccessible)
例如带属性的枚举:
public enum Status {
SUCCESS(200, "操作成功"),
FAILED(500, "操作失败");
private final int code;
private final String msg;
Status(int code, String msg) { this.code = code; this.msg = msg; }
// getter 省略
}
// 获取时可遍历并调用 getCode()、getMsg()
注意事项
-
getEnumConstants()返回的是运行时实际枚举常量的副本,不可修改 - 反射调用
values()在模块化(Java 9+)中无需额外开放,因该方法是 public 的 - 避免对非枚举类调用,否则
getEnumConstants()返回 null,反射调用会抛NoSuchMethodException - 泛型枚举(如
Enum<t></t>)仍可用,但需确保类型擦除后 Class 正确
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











