Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
存储枚举的字段使用 Field.set()
和 Field.get()
设置和获取,与任何其他引用类型一样。有关访问字段的详细信息,请参阅此路径的 Fields 部分。
考虑需要动态修改服务器应用程序中跟踪级别的应用程序,该应用程序通常在运行时不允许此更改。假设服务器对象的实例可用。
示例显示了代码如何将表示枚举的 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 OFF Original trace level: OFF $ java SetTrace DEBUG Original trace level: OFF New trace level: DEBUG