1. 程式人生 > >靜態常量(static final)在class檔案中是怎樣的呢?

靜態常量(static final)在class檔案中是怎樣的呢?

最近寫專案遇到一個問題,來回折騰了幾次,終於探究清楚了。不廢話,上例子。

背景:因為專案小,沒有使用配置檔案,所有靜態常量都放在Config.java裡面了

public class Config {
    public static final String URL="http://www.xxxx.com/";
    public static final int PAGE_NUM=10;
}
看起來也不錯啊,沒什麼大問題,都這麼用的啊。

好吧,放到伺服器上執行一下,正常啊。

接下來,問題來了。

URL改,PAGE_NUM也改。

public class Config {
    public static final String URL="http://www.yyyy.com/";
    public static final int PAGE_NUM=200;
}

好了,生成下class檔案,放到伺服器上,喝杯茶。。。

重新整理下,沒變,再等等,伺服器有個轉換時間。。。

30s。。。沒變

1min。。。沒變

重啟伺服器。。。(應該好了)

怎麼還是沒變[email protected]@@###&&&+++***(到底怎麼回事,伺服器壞了,重灌?)

其實什麼都沒壞。你不信?往下看。

找個小工具,把class檔案反編譯一下,找找引用常量的地方,你就瞬間明白了。

不是你想象的

Config.URL
Config.PAGE_NUM

而是
"http://www.xxxx.com/"
10

明白了吧,常量在class檔案中,直接替換為值了。

那還是想用Config.java,又不想改很多地方,怎麼辦?

兩個方法:

public class Config {
    public static final String URL=new String("http://www.xxxx.com/");//好用
    public static final int PAGE_NUM=new Integer(10);//不好用
}
public class Config {
    public static String getURL(){
	return "http://www.yyyy.com";
    } 
    public static int getPageNum(){
	return 200;
    } 
}


好了,其餘的,等待大家去發現。

相關推薦

靜態常量(static final)在class檔案是怎樣的

最近寫專案遇到一個問題,來回折騰了幾次,終於探究清楚了。不廢話,上例子。 背景:因為專案小,沒有使用配置檔案,所有靜態常量都放在Config.java裡面了 public class Config { public static final String URL

Class檔案常量

常量池計數器   常量池是class檔案中非常重要的結構,它描述著整個class檔案的字面量資訊。 常量池是由一組constant_pool結構體陣列組成的,而陣列的大小則由常量池計數器指定。   常量池計數器constant_pool_count 的值 =constant_pool表中的成員數+ 1。   

eclipse打斷點只進入class檔案的解決辦法

內容來源 https://www.cnblogs.com/scode2/p/8671908.html#undefined 是由於對應的Java類跟編譯後的class檔案,沒有關聯上, 解決辦法: 在打斷點除錯的時候,如果發現進入到了class檔案,先彆著急關閉class檔案,在該class檔案

配置在.properties檔案常量,在xml檔案使用

首先你先在.properties檔案中以鍵值對的形式寫好之後,在spring配置檔案先將這個資原始檔初始化成bean,然後再在XML中以${……}的形式取出裡邊的值。 在spring中的配置是: <!-- 配置的資原始檔 -->     <bean id=

《Java虛擬機器原理圖解》1.3、class檔案的訪問標誌、類索引、父類索引、介面索引集合

講完了class檔案中的常量池,我們就相當於克服了class檔案中最麻煩的模組了。現在,我們來看一下class檔案中緊接著常量池後面的幾個東西:訪問標誌、類索引、父類索引、介面索引集合 訪問標誌、類索引、父類索引、介面索引集合 在class檔案中的位置

《Java虛擬機器原理圖解》1.5、 class檔案的方法表集合--method方法在class檔案是怎樣組織的

0. 前言          瞭解JVM虛擬機器原理是每一個Java程式設計師修煉的必經之路。但是由於JVM虛擬機器中有很多的東西講述的比較寬泛,在當前接觸到的關於JVM虛擬機器原理的教程或者部落格中

JAVA class檔案的符號引用

在java程式碼中,一個類可能使用另外類或者介面的欄位或者呼叫另外一個類的方法。 在編譯的時候,class檔案中是通過叫做"符號引用"的方式來實現的。 如下面的例子 public interface Intf {         public static String s

java編譯期常量 static final

package testPage; class InitalizedClass { static { System.out.println("You have initalized InitalizedClass!"); } //和上面的例子唯一的差異就是此

eclipse打斷點除錯進入到class檔案,不顯示變數值的解決辦法彙總

問題描述:eclipse打斷點除錯進入到class檔案中,而且監視區不顯示變數結果是由於對應的Java類跟編譯後的class檔案,沒有關聯上,解決辦法:在打斷點除錯的時候,如果發現進入到了class檔案,先彆著急關閉class檔案,在該class檔案中有個按鈕,然後點選這個按鈕,選擇跟該專案對應的專案型別(j

Class檔案為什麼要使用魔數?

Class檔案是一組以8位位元組為基礎單位的二進位制流,檔案中記錄了一個類或介面的定義資訊,檔案中的各個資料項嚴格按照順序緊湊排列,中間不使用分隔符,所以Class檔案中儲存的都是程式執行必要的引數。 每個Class檔案的頭四個位元組被稱為魔數,使用十六進位制

Javafinalstatic final 修飾的常量的區別

評論 tin 產生 建立 dom code 隨機數 ren 使用 喵喵開車,新手上路,多多關照。有任何錯誤請在評論區指出。 ...........................................我是萬惡的分界線( ? ?ω?? )?.............

在JAVA利用public static final的組合方式對常量進行標識

pan tex 方法 進行 系統設置 ext lean boolean lse 在JAVA中利用public static final的組合方式對常量進行標識(固定格式)。 對於在構造方法中利用final進行賦值的時候,此時在構造之前系統設置的默認值相對於構造方法失效。

Java的組織形式、類與物件、靜態static關鍵字、最終的final關鍵字、方法傳參方式、遞迴(階乘、斐波那契數列、漢諾塔)

Java程式的組織形式 Java程式需要把程式碼以類的形式組織起來,然後被Java編譯器編譯,再被JVM執行。Java程式是以類的結構為基礎的。 Java程式的基本要素 識別符號 識別符號命名規範 關鍵字(保留字) 關鍵字(保留字)具有專門的意義和用途

Javastatic final常量”的坑

在Java中,其實語言本身並沒有“常量”這樣的概念。但是我們根據常量的特點(不可修改),經常會使用“static final”關鍵字,對一個變數進行修飾,以達到不建立類就可直接使用,並且該變數不允許修改的目的,看起來就跟“常量”一樣。無論是教科書,還是上網查資料,都會教我們這樣寫 這樣的寫法在純

《為什麼非靜態內部類不能有static屬性的變數,卻可以有static final屬性的變數?》

每當我們翻閱有關Java的入門書籍,進入關於內部類的章節時,我們經常可以看到某某書上寫道: ——非靜態實名內部類(成員內部類)中不能含有static修飾的變數,但是可以含有st

class檔案結構[2] static finalstaticfinal、普通型別成員變數的賦初值

不考慮作用域修飾符,成員變數的型別有: static final 型別、僅static型別、僅final型別、普通型別 並且,我們在定義成員變數的時候,還可以通過=賦初值。(其中包含final時強制要求賦初值) 那麼,這些賦值操作都是在哪個階段完成的呢? 按照執行的先後順序 1.對於staticfinal

javastatic關鍵字再學習,靜態成員記憶體理解,靜態常量應用,靜態修飾成員在多型呼叫的問題

一、static的啟用原因 1、假設一個Student類,包含三個屬性,姓名,年齡,學校。姓名,年齡不同,但是學校都相同,當例項化這個類時都會對這三個屬性賦初值。由於學校都相同,new的次數越多,就會形成了巨大的浪費。 為了杜絕這種浪費,設定了一個共享資料方法,即static關鍵字

標頭檔案定義static靜態變數的利弊

對於儲存位置:靜態變數的效果和全域性變數的效果是一樣的,他們都儲存在全域性資料區。頻繁使用其實效率更高,如果定義的靜態變數不用,那就會浪費記憶體,因為全域性資料區生命週期是從程式執行到結束。 區域性變數:每次棧上都要為區域性變數分配空間,因此區域性變數太多

在cpp檔案使用類的靜態static資料報連線錯(LNK2001)

現有如下一個類: class CPlayer{ public: ... private: static CPlayer* pthis; ... }; 在cpp中使用pthis指標會報如下連結錯: error LNK2001: unresolved ext

C語言存儲類別又分為四類:自動(auto)、靜態static)、寄存器的(register)和外部的(extern)。

字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適