摘要:舉個(gè)例子類使用了這個(gè)常量,表面上是通過類取得的這個(gè)值,實(shí)際上在被編譯后,其代碼其實(shí)變成了通過上面的分析,要使常量修改后,其他引用的也同步改過來,就必須將引用了這個(gè)常量的重新編譯后上傳,這樣才能同步修改。
代碼中我們一般都使用一個(gè)類統(tǒng)一管理常量,例如:
public class AppConst { public static final String STR_1 = "String1"; public static final String STR_2 = "String2"; ...... }
這樣我們?cè)谛薷某A恐档臅r(shí)候只用在這個(gè)類中修改即可,今天我遇到了一個(gè)很費(fèi)解的問題,我在SpringMVC工程中需要需改一個(gè)常量值,因?yàn)镾pringMVC工程的class文件眾多,所以我偷懶只將修改后編譯的AppConst class文件上傳到服務(wù)器替換了,結(jié)果無論怎么調(diào)用常量對(duì)應(yīng)的值都沒有更新過來,通過反編譯調(diào)用的class文件發(fā)現(xiàn),使用常量的地方,已經(jīng)被替換成常量的值,也就是說編譯后常量的值“就地展開”,不是“動(dòng)態(tài)引用”的,經(jīng)過搜索發(fā)現(xiàn)如下內(nèi)容:
靜態(tài)常量(即用 static final
修飾的變量)是編譯時(shí)常量,當(dāng)一個(gè)class文件編譯完畢,它內(nèi)部使用到的所有常量的具體值就已經(jīng)確定了,不能想當(dāng)然地以為它在運(yùn)行時(shí)并連接常量管理類之后才會(huì)以引用方式使用常量。
舉個(gè)例子
import AppConst; public class SomeService { public void serviceJob1() { System.out.println(AppConst.STR_1); } }
類SomeService使用了STR_1這個(gè)常量,表面上是通過AppConst類取得的這個(gè)值,實(shí)際上在SomeService被編譯后,其代碼其實(shí)變成了
import AppConst; public class SomeService { public void serviceJob1() { System.out.println("String1"); } }
通過上面的分析,要使常量修改后,其他引用的class也同步改過來,就必須將引用了這個(gè)常量的class重新編譯后上傳,這樣才能同步修改。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70088.html
摘要:關(guān)鍵字的字面意思是最終的不可修改的這似乎是一個(gè)看見名字就大概能知道怎么用的語法但你是否有深究過在各個(gè)場(chǎng)景中的具體使用方法注意事項(xiàng)以及背后涉及的設(shè)計(jì)思想呢一修飾變量基礎(chǔ)修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識(shí)被修飾的變量 final關(guān)鍵字的字面意思是最終的, 不可修改的. 這似乎是一個(gè)看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個(gè)場(chǎng)景中的具體使用方法...
摘要:關(guān)鍵字的字面意思是最終的不可修改的這似乎是一個(gè)看見名字就大概能知道怎么用的語法但你是否有深究過在各個(gè)場(chǎng)景中的具體使用方法注意事項(xiàng)以及背后涉及的設(shè)計(jì)思想呢一修飾變量基礎(chǔ)修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識(shí)被修飾的變量 final關(guān)鍵字的字面意思是最終的, 不可修改的. 這似乎是一個(gè)看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個(gè)場(chǎng)景中的具體使用方法...
摘要:關(guān)鍵字的字面意思是最終的不可修改的這似乎是一個(gè)看見名字就大概能知道怎么用的語法但你是否有深究過在各個(gè)場(chǎng)景中的具體使用方法注意事項(xiàng)以及背后涉及的設(shè)計(jì)思想呢一修飾變量基礎(chǔ)修飾基本數(shù)據(jù)類型變量和引用數(shù)據(jù)類型變量相信大家都具備基本的常識(shí)被修飾的變量 final關(guān)鍵字的字面意思是最終的, 不可修改的. 這似乎是一個(gè)看見名字就大概能知道怎么用的語法, 但你是否有深究過final在各個(gè)場(chǎng)景中的具體使用方法...
摘要:的內(nèi)存分配方式修飾變量通常情況下,變量有個(gè)地方可以賦值直接賦值,構(gòu)造函數(shù)中,或是初始化塊中。如就是對(duì)于變量,在聲明時(shí),如果你沒有賦值,系統(tǒng)默認(rèn)這是一個(gè)空白域,在構(gòu)造函數(shù)進(jìn)行初始化,如果是靜態(tài)的,則可以在初始化塊。 【java中為什么會(huì)有final變量】: final這個(gè)關(guān)鍵字的含義是這是無法改變的或者終態(tài)的; 那么為什么要阻止改變呢? java語言的發(fā)明者可能由于兩個(gè)目的而阻止改變: ...
摘要:某個(gè)測(cè)試服務(wù)器試圖通過反射來修改變量的值,出現(xiàn)了時(shí)靈時(shí)不靈的現(xiàn)象。這個(gè)閾值隨時(shí)會(huì)變,只是測(cè)著玩的編譯是可以取消的,現(xiàn)在修改如下,在用反射設(shè)值后,再次執(zhí)行萬次直接取值現(xiàn)在的執(zhí)行結(jié)果又是了。結(jié)論不要修改變量,會(huì)出問題的關(guān)于編譯期優(yōu)化的更多知識(shí) 某個(gè)測(cè)試服務(wù)器試圖通過反射來修改static final變量的值,出現(xiàn)了時(shí)靈時(shí)不靈的現(xiàn)象。 開發(fā)環(huán)境無法重現(xiàn)。這是怎么回事呢? 先介紹背景知識(shí) 一般...
閱讀 2005·2021-08-11 11:13
閱讀 1028·2021-07-25 21:37
閱讀 2583·2019-08-29 18:42
閱讀 2519·2019-08-26 12:18
閱讀 924·2019-08-26 11:29
閱讀 1697·2019-08-23 17:17
閱讀 2672·2019-08-23 15:55
閱讀 2615·2019-08-23 14:34