该Java教程针对JDK 8编写。本页面描述的示例和实践不利用后续版本中引入的改进,并可能使用不再可用的技术。
请参阅Java语言更改了解Java SE 9及其后续版本中的更新语言功能的摘要。
请参阅JDK发布说明了解有关所有JDK版本的新功能、增强功能和已删除或已弃用选项的信息。
存储枚举的字段可以像其他引用类型一样使用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("原始跟踪级别: %s%n", oldLevel); if (oldLevel != newLevel) { f.set(svr, newLevel); out.format(" 新的跟踪级别: %s%n", f.get(svr)); } // 生产代码应该更优雅地处理这些异常 } catch (IllegalArgumentException x) { x.printStackTrace(); } catch (IllegalAccessException x) { x.printStackTrace(); } catch (NoSuchFieldException x) { x.printStackTrace(); } } }
由于枚举常量是单例的,可以使用==
和!=
运算符来比较相同类型的枚举常量。
$ java SetTrace OFF 原始跟踪级别: OFF $ java SetTrace DEBUG 原始跟踪级别: OFF 新的跟踪级别: DEBUG