通过反思获得枚举的价值

bla*_*ter 7 java reflection enums

我有一个这样的枚举:

public enum Mode{
  RUNNING("SytemRunning"),
  STOPPED("SystemStopped"),
  IDLE("tmpIdle");

  public static String key;

  private Mode(String key){
    this.key = key;
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想通过反射来获取此枚举的键(SystemRunning,SystemStopped,tmpIdle):

Class<?> c = Class.forName("Mode");
Object[] objects = c.getEnumConstants();
// now this is not what I want, but almost
for(Object obj : objects){
  System.out.println("value : " + obj);
}
Run Code Online (Sandbox Code Playgroud)

输出是:RUNNING STOPPED IDLE

但是,我想要使用Strings SystemRunning,tmpIdle等.

非常感谢你提前.

Sud*_*hul 9

首先,您需要创建key一个非静态变量.

private String key; // I made it private on purpose
Run Code Online (Sandbox Code Playgroud)

然后你需要在你的枚举中添加一个getter方法,它将返回 key

public String getKey() {
    return key;
}
Run Code Online (Sandbox Code Playgroud)

然后将你的for循环改为这样的东西.

for (Object obj : objects) {
    Class<?> clzz = obj.getClass();
    Method method = clzz.getDeclaredMethod("getKey");
    String val = (String) method.invoke(obj);
    System.out.println("value : " + val); // prints SytemRunning, SystemStopped and tmpIdle
}
Run Code Online (Sandbox Code Playgroud)


Cyr*_*eux 6

添加一个返回键的toString()方法,然后它就可以了.您的"密钥"属性不应该是静态的.

如果你知道你的所有枚举都有一个关键属性,你也可以通过反射直接询问它.

public enum Mode{
  RUNNING("SytemRunning"),
  STOPPED("SystemStopped"),
  IDLE("tmpIdle");

  public String key;

  private Mode(String key) {
    this.key = key;
  }
  public String toString() {
    return this.key;
  }
}
Run Code Online (Sandbox Code Playgroud)

用反射获取"关键":

Class<?> c = Class.forName("Mode");
Object[] objects = c.getEnumConstants();
// now this is not what I want, but almost
for(Object obj : objects) {
  try {
    Field keyField = obj.getClass.getDeclaredField("key");
    keyField.setAccessible(true); // if it is private for example.
    System.out.printn("value : " + keyField.get(obj);
  } catch (NoSuchFieldException e) {
    // fallback to toString()
    System.out.println("value : " + obj);
  }
}
Run Code Online (Sandbox Code Playgroud)