的Eclipse和println似乎不同意动态设置私人最终静态字段的值

问题描述:

虽然与自省玩,我发现一个有趣的情况:的Eclipse和println似乎不同意动态设置私人最终静态字段的值

  • Eclipse的调试器显示工具提示true
  • 的println打印false(注在控制台选项卡的输出):

eclipse

我尝试为了设置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); 
    } 
} 
+0

由于VAR是一个可以内联的常量。 – Henry

编译器'内联'static final值。如果你看一下字节码的println,你会看到类似这样的:

iconst_0 
invokevirtual java.io.PrintStream.println(boolean) 

,因为它知道值不会改变编译器产生,由装载值0(假)码的情况下直接引用VAR变量,因此您对变量的更改将被忽略。

由于内联,您不能依靠能够通过反射来更改static final变量的值。