我有一个这样的枚举:
public enum Mode{
RUNNING("SytemRunning"),
STOPPED("SystemStopped"),
IDLE("tmpIdle");
public static String key;
private Mode(String key){
this.key = key;
}
}
现在,我想通过反射来获取此枚举的键(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);
}
输出是: RUNNING 已停止 IDLE
但是,我想要使用Strings SystemRunning,tmpIdle等。
非常感谢你。
答案 0 :(得分:7)
首先,您需要将key
设为非静态变量。
private String key; // I made it private on purpose
然后你需要在你的枚举中添加一个getter方法,它将返回key
public String getKey() {
return key;
}
然后将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
}
答案 1 :(得分:5)
添加一个返回键的toString()方法,然后它就可以了。 你的关键&#39;财产不应该是静态的。
如果你知道你的所有枚举都有一个关键属性,你也可以通过反射直接询问它。
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;
}
}
获取关键&#39;反思:
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);
}
}
答案 2 :(得分:2)
使用反射是没有意义的:
public interface EnumWithValue<T> {
T getValue();
}
public enum Mode implements EnumWithValue<String> {
RUNNING("SytemRunning"),
STOPPED("SystemStopped"),
IDLE("tmpIdle");
private final String value;
private Mode(String value) {
this.value = value;
}
@Override
public String getValue() {
return value;
}
}
public void test() {
try {
Class<? extends EnumWithValue<String>> clazz = (Class<? extends EnumWithValue<String>>) Class.forName("Mode");
EnumWithValue<String>[] values = clazz.getEnumConstants();
for (EnumWithValue<String> enumWithValue : values) {
System.out.print(enumWithValue + " = " + enumWithValue.getValue());
}
} catch (ClassNotFoundException ex) {
Logger.getLogger(ConverterEnum.class.getName()).log(Level.SEVERE, null, ex);
}
}