的Eclipse和println似乎不同意动态设置私人最终静态字段的值
问题描述:
虽然与自省玩,我发现一个有趣的情况:的Eclipse和println似乎不同意动态设置私人最终静态字段的值
- Eclipse的调试器显示工具提示
true
- 的println打印
false
(注在控制台选项卡的输出):
我尝试为了设置private final static
字段的值,我猜我做错了?
这里实际发生了什么?
import java.lang.reflect.*;
public class Main {
private final static boolean VAR = false; // I want to dynamically set this to true
public static void main(String[] args) throws Exception {
Field field = Main.class.getDeclaredField("VAR");
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, true);
System.out.println(VAR);
}
}
答
编译器'内联'static final
值。如果你看一下字节码的println
,你会看到类似这样的:
iconst_0
invokevirtual java.io.PrintStream.println(boolean)
,因为它知道值不会改变编译器产生,由装载值0(假)码的情况下直接引用VAR
变量,因此您对变量的更改将被忽略。
由于内联,您不能依靠能够通过反射来更改static final
变量的值。
由于VAR是一个可以内联的常量。 – Henry