文档

Java™教程
隐藏目录
使用枚举类型获取和设置字段
路径: 反射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("原始跟踪级别:  %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

上一页: 枚举类型的详细讨论
下一页: 故障排除