Java虛擬機編譯機制:更改常量部分

Java虛擬機編譯機制:更改常量部分

最近一個Java項目中須要修改一個靜態常量的值,本地修改編譯之後調試正常,而後把對應的entity類的class文件上傳到服務器對應的目錄之後系統依舊我行我素,各類清除緩存,各類重啓,最後查詢了相關資料,使用GUI反編譯工具反編譯查看編譯後源碼,終於找到問題所在:

***    單純的修改靜態變量是沒用的,還要從新編譯全部引用靜態變量的類,否則不會生效的。

這裏就牽扯到Java虛擬機編譯機制:在Java文件中,指向編譯時static final的靜態常量, 會被在運行時解析爲一個局部的常量值(也就是說靜態常量在編譯後,成爲了常量,而不是原先的代碼)。這對全部的基礎數據類型(就像int ,float等)和java.lang.String都適用。

例如: java

public class Contant{
		public static final String STR = "alexgaoyh";
		//...... 
    }
而後在某些邏輯代碼段裏使用了這些常量。這樣作能夠便於管理常量,避免了大量的magic number/text,在修改常量內容時只需改這一個類就好了。

public class TestService {
		public void doSome() {
			//這裏應用了上一個類的靜態常量Contant.STR
			System.out.println(Contant.STR);
		}
    }
類TestService使用了Contant.STR這個常量,表面上是經過Contant類取得的這個值,實際上在TestService被編譯後,其代碼已經改變爲

public class TestService {
		public void doSome() {
		//這裏把靜態常量Contant.STR直接編譯成爲了一個常量"alexgaoyh"
		System.out.println("alexgaoyh");
		}
	}
也就是說    在全部使用常量的地方,都要從新進行編譯才能生效。
相關文章
相關標籤/搜索