【发布时间】:2014-10-13 23:37:33
【问题描述】:
基于Change private static final field using Java reflection,我尝试设置一个私有静态final字段。
(我知道这非常 hacky,但这个问题与代码质量无关;它与 Java 反射有关。)
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
class Main {
static class Foo {
private static final int A = 1;
int getA() {
return A;
}
}
public static void main(String[] args) throws Exception {
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
Field field = Foo.class.getDeclaredField("A");
field.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, 2);
System.out.println(new Foo().getA()); // should print 2
}
}
打印出来
1
我已经在 OpenJDK 6 和 7 以及 Oracle 7 上尝试过。
我不知道 Java 反射提供了什么保证。但是如果它失败了,我认为会有一个Exception(实际上所有的反射方法都会抛出异常)。
这里发生了什么?
【问题讨论】:
-
什么是
modifiers?
标签: java reflection