通过反射访问枚举名称

时间:2014-12-01 14:11:37

标签: java reflection enums

我正在尝试通过反射(name类的Enum字段)访问枚举的名称,但我得到NoSuchFieldException

请参阅下面的一个简单示例:程序为Integer打印5但为枚举抛出异常。

是否有一种优雅的方法可以让inspect方法用于枚举?

public class Test {
  static enum A {
    A;
  }
  public static void main(String[] args) throws Exception {
    Integer i = 5;
    System.out.println(inspect(i, "value")); // prints 5, good

    A a = A.A;
    System.out.println(inspect(a, "name"));  // Exception :-(
  }

  private static Object inspect(Object o, String fieldName) throws Exception {
    Field f = o.getClass().getDeclaredField(fieldName);
    f.setAccessible(true);
    return f.get(o);
  }
}

1 个答案:

答案 0 :(得分:2)

getFieldgetDeclaredField方法仅返回在被调用类中声明的字段的正结果。他们不会搜索超类中声明的字段。因此,要获得名称字段的引用,您需要更深入。获取超类引用(在您的情况下将为Enum类)并在那里搜索名称字段。

o.getClass().getSuperclass().getDeclaredField(fieldName);