(转)更新Java final常量后,请重新编译你的class
程序中使用的各種常量用一個類來統一管理,類似:
?
然后在某些邏輯代碼段里使用了這些常量。這樣做可以便于管理常量,避免了大量的magic number/text,在修改常量內容時只需改這一個類就行了,但有時候會奇怪地發現,重新編譯打包的程序依舊我行我素,并沒有即時反應我們對常量的修改,這是何解呢?
??? 在之前的《JVM學習筆記三--類的初始化》中我曾提到,靜態常量(即用 static final 修飾的變量)是編譯時常量,當一個class文件編譯完畢,它內部使用到的所有常量的具體值就已經確定了,不能想當然地以為它在運行時并連接常量管理類之 后才會以引用方式使用常量。比如下面這段代碼:
?
類SomeService使用了STR_1這個常量,表面上是通過AppConst類取得的這個值,實際上在SomeService被編譯后,其代碼其實變成了
這里面根本沒有AppConst什么事,所以你即使修改了AppConst的相關常量,令STR_1 = "NotString1",SomeService可能依然會打印"String1",因為SomeService的代碼沒有任何修改,在增量編譯的情況 下,它的class文件不會被重新編譯。
明白了上面這些,大致就知道怎么辦了,我的方法有兩個:
1. 原始條件下,刪除class文件后手動重編譯。
2. 使用IDE的時候, 先對SomeService做一個細微修改并保存(會自動編譯),然后再修改回來并保存(再次自動編譯)。如此class文件就會被更新了。
?
是這樣的,單純的修改靜態變量是沒用的,還要重新編輯所有引用靜態變量的類,不然不會生效的。
?
改成?
??
就可以僅僅修改并編譯一個類就行了 .
從根本上來解決此問題得這么做,最簡單。
反編譯,你會發現在引用此靜態類屬性的時候,引用代碼不是直接用具體值替代,而還是源代碼里的引用。
一句話總結,在靜態類里定義的靜態屬性,堅決不用引用類型,而需要用對象類型。
?來自:http://blog.csdn.net/ahhsxy/article/details/6097881
轉載于:https://www.cnblogs.com/sunxucool/p/3246444.html
總結
以上是生活随笔為你收集整理的(转)更新Java final常量后,请重新编译你的class的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于来了,OpenAI发布iOS版Cha
- 下一篇: 锁屏下可查看联系人信息,苹果 iOS /