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等.
非常感谢你提前.
首先,您需要创建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)
添加一个返回键的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)