【发布时间】:2009-05-11 21:23:02
【问题描述】:
Java静态final类变量的值可以通过反射获取吗?
【问题讨论】:
标签: java reflection
Java静态final类变量的值可以通过反射获取吗?
【问题讨论】:
标签: java reflection
我猜这取决于类型和编译器(再想一想,最好不要!)。 Sun 的编译器内联原始常量,但我不知道它们是否完全从类中删除了条目。我会找出答案的。
编辑:是的,即使它们是内联的,您仍然可以访问它们。测试类:
public class ReflectionConstantTest {
private static final int CONST_INT = 100;
private static final String CONST_STRING = "String";
private static final Object CONST_OBJECT = new StringBuilder("xyz");
public static void main(String[] args) throws Exception {
int testInt = CONST_INT;
String testString = CONST_STRING;
Object testObj = CONST_OBJECT;
for (Field f : ReflectionConstantTest.class.getDeclaredFields()) {
f.setAccessible(true);
System.out.println(f.getName() + ": " + f.get(null));
}
}
}
输出:
常量_INT:100 CONST_STRING:字符串 CONST_OBJECT: xyzjavap -c 输出:
您可以看到CONST_INT 是内联的,但CONST_STRING 和CONST_OBJECT(当然)不是。然而CONST_INT 仍然可以通过反射获得。
【讨论】:
是的。 (只是没有静态、实例这样的东西。它是静态的、非实例。)
> If the underlying field is a static field, the obj argument is ignored; it may be null.
(包括标准警告,大多数使用反射都是一个坏主意)
【讨论】:
如果您的项目允许使用开源库,您可以使用
FieldUtils.readDeclaredStaticField
public class Test {
public final static String CONSTANT="myConstantValue";
}
在另一个类中你可以使用:
Object value = FieldUtils.readDeclaredStaticField(Test.class, "CONSTANT");
System.out.println(value);
您将在控制台中看到“myConstantValue”。
【讨论】:
仅获取名称和值不需要 setAccessible(true)。当您必须处理接口中声明的常量并需要符号名称时,这是一个有用的示例:
interface Code {
public static final int FOO = 0;
public static final int BAR = 1;
}
...
try {
for (Field field : Code.class.getDeclaredFields()) {
String name = field.getName();
int value = field.getInt(null);
System.out.println(name + "=" + value);
}
}
catch (IllegalAccessException e) {
System.out.println(e);
}
【讨论】: