Spec-Zone .ru
спецификации, руководства, описания, API
|
Поля, которые хранят перечисления, устанавливаются и получаются как любой другой ссылочный тип, используя 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 OFF Original trace level: OFF $ java SetTrace DEBUG Original trace level: OFF New trace level: DEBUG