使用枚举类型获取和设置字段
原文: https://docs.oracle.com/javase/tutorial/reflect/special/enumSetGet.html
使用 Field.set() 和 Field.get() 设置和检索存储枚举的字段与任何其他引用类型一样。有关访问字段的更多信息,请参阅此跟踪的字段部分。
考虑需要动态修改服务器应用程序中跟踪级别的应用程序,该应用程序通常在运行时不允许此更改。假设服务器对象的实例可用。 SetTrace 示例显示了代码如何将枚举的 String 表示转换为枚举类型并检索和设置字段存储的值一个枚举。
import java.lang.reflect.Field;import static java.lang.System.out;enum TraceLevel { OFF, LOW, MEDIUM, HIGH, DEBUG }class MyServer {private TraceLevel level = TraceLevel.OFF;}public class SetTrace {public static void main(String... args) {TraceLevel newLevel = TraceLevel.valueOf(args[0]);try {MyServer svr = new MyServer();Class<?> c = svr.getClass();Field f = c.getDeclaredField("level");f.setAccessible(true);TraceLevel oldLevel = (TraceLevel)f.get(svr);out.format("Original trace level: %s%n", oldLevel);if (oldLevel != newLevel) {f.set(svr, newLevel);out.format(" New trace level: %s%n", f.get(svr));}// production code should handle these exceptions more gracefully} catch (IllegalArgumentException x) {x.printStackTrace();} catch (IllegalAccessException x) {x.printStackTrace();} catch (NoSuchFieldException x) {x.printStackTrace();}}}
由于枚举常数是单例,因此==和!=运算符可用于比较相同类型的枚举常量。
$ java SetTrace OFFOriginal trace level: OFF$ java SetTrace DEBUGOriginal trace level: OFFNew trace level: DEBUG
