|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Поля, которые хранят перечисления, устанавливаются и получаются как любой другой ссылочный тип, используя Field.set() и . Для получения дополнительной информации по доступу к полям см. Полевой раздел этого следа.
Рассмотрите заявление, которое должно динамически изменить уровень трассировки в серверном приложении, которое обычно не позволяет это изменение во время времени выполнения. Предположите, что экземпляр серверный объекта доступен. представление перечисления в перечислимый тип и получает и устанавливало значение поля, хранящего перечисление.
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