2016-10-19 12 views
1

Во время игры с самоанализом, я нашел интересную ситуацию, когда:Eclipse, и Println, кажется, не согласны по стоимости динамически установленного частного конечного статического поля

  • в Eclipse отладчик подсказке отображается true
  • Println печатает false (примечание выход на вкладке Console):

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

ответ

2

Компилятор «встраивает» значение static final. Если вы посмотрите на байткод для println вы увидите что-то вроде:

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

Потому что знает, что значение не изменится компилятор сгенерировал код, который нагружает значение 0 (для ложной) непосредственно без обращения к переменная VAR, поэтому ваше изменение переменной игнорируется.

Из-за наложения вы не можете рассчитывать на возможность изменения значения переменной static final с отражением.