使用枚举类型获取和设置字段

原文: https://docs.oracle.com/javase/tutorial/reflect/special/enumSetGet.html

使用 Field.set()Field.get() 设置和检索存储枚举的字段与任何其他引用类型一样。有关访问字段的更多信息,请参阅此跟踪的字段部分。

考虑需要动态修改服务器应用程序中跟踪级别的应用程序,该应用程序通常在运行时不允许此更改。假设服务器对象的实例可用。 SetTrace 示例显示了代码如何将枚举的 String 表示转换为枚举类型并检索和设置字段存储的值一个枚举。

  1. import java.lang.reflect.Field;
  2. import static java.lang.System.out;
  3. enum TraceLevel { OFF, LOW, MEDIUM, HIGH, DEBUG }
  4. class MyServer {
  5. private TraceLevel level = TraceLevel.OFF;
  6. }
  7. public class SetTrace {
  8. public static void main(String... args) {
  9. TraceLevel newLevel = TraceLevel.valueOf(args[0]);
  10. try {
  11. MyServer svr = new MyServer();
  12. Class<?> c = svr.getClass();
  13. Field f = c.getDeclaredField("level");
  14. f.setAccessible(true);
  15. TraceLevel oldLevel = (TraceLevel)f.get(svr);
  16. out.format("Original trace level: %s%n", oldLevel);
  17. if (oldLevel != newLevel) {
  18. f.set(svr, newLevel);
  19. out.format(" New trace level: %s%n", f.get(svr));
  20. }
  21. // production code should handle these exceptions more gracefully
  22. } catch (IllegalArgumentException x) {
  23. x.printStackTrace();
  24. } catch (IllegalAccessException x) {
  25. x.printStackTrace();
  26. } catch (NoSuchFieldException x) {
  27. x.printStackTrace();
  28. }
  29. }
  30. }

由于枚举常数是单例,因此==!=运算符可用于比较相同类型的枚举常量。

  1. $ java SetTrace OFF
  2. Original trace level: OFF
  3. $ java SetTrace DEBUG
  4. Original trace level: OFF
  5. New trace level: DEBUG