寫這篇文章的起因是前幾天同事改了一個常量類中的提示轰胁,發(fā)布到測試環(huán)境后沒有生效谒主,正好看 《Java 解惑(謎題 93: 類的戰(zhàn)爭)》 提到了這個問題,所以寫篇文章記錄一下赃阀。
以下均使用命令行進行演示霎肯,至于為什么沒有使用 IDE 后面會提到擎颖。
先看一個簡單的 Constants 類:
/**
* Created by Poison on 15/05/2017.
*/
public class Constants {
public static final String a = "before fixing";
}
再看下 Solution 類:
/**
* Created by Poison on 15/05/2017.
*/
public class Solution {
public static void main(String[] args) {
System.out.println(Constants.a);
}
}
編譯,運行 Solution 的主函數(shù)观游,毫無疑問結果如圖:
現(xiàn)在我們把 Constants 類修改為:
/**
* Created by Poison on 15/05/2017.
*/
public class Constants {
public static final String a = "after fixing";
}
重新編譯 Constants 類搂捧,再運行 Solution 的主函數(shù),輸出結果如圖:
為什么修改沒有生效懂缕?是 Constants 類的問題允跑,還是 Solution 類的問題?
我們先反編譯 Constants 類看看:
由上圖可見搪柑,對 Constants 類的修改是生效的聋丝。
再看反編譯的 Solution 類:
看到這里,原因也就明確了工碾,常量變量會被編譯進那些引用它們的類中弱睦。這和筆者同事前幾日遇到的情況一模一樣,同事在本地開發(fā)時修改了常量類中的常量字段的值渊额,本地是生效的况木,原因是因為本地開發(fā)使用了 IDE,而 IDE 將引用到常量類的類也重新編譯了旬迹,所以能看到最新的值火惊,而在發(fā)布到測試環(huán)境的過程中,打包機僅僅將常量類所屬的模塊進行了重新編譯舱权,未將引用常量的類的模塊重新編譯矗晃,所以當時看見的是更改前的值,同事將常量類的 class 文件反編譯后看見的也是修改后的值宴倍,但是卻忘了看引用該常量類的類张症,所以當時沒有發(fā)現(xiàn)這個問題。
Java 解惑
Java 虛擬機規(guī)范(Java SE 8版)
更多文章鸵贬,請訪問 田爽Poison