Java是一種動態連接的語言,常量池的作用非常重要,常量池中除了包含代碼中所定義的各種基本類型(如int、long等等)和對象型(如String及數組)的常量值還,還包含一些以文本形式出現的符號引用,比如:
類和接口的全限定名;
字段的名稱和描述符;
方法和名稱和描述符。
在C語言中,如果一個程序要調用其它庫中的函數,在連接時,該函數在庫中的位置(即相對于庫文件開頭的偏移量)會被寫在程序中,在運行時,直接去這個地址調用函數;新疆軟件開發網 而在Java語言中不是這樣,一切都是動態的。編譯時,如果發現對其它類方法的調用或者對其它類字段的引用的話,記錄進class文件中的,只能是一個文本形式的符號引用,在連接過程中,虛擬機根據這個文本信息去查找對應的方法或字段。
所以,與Java語言中的所謂“常量”不同,class文件中的“常量”內容很非富,這些常量集中在class中的一個區域存放,一個緊接著一個,這里就稱為“常量池”。
常量池由多條“常量池項”組成,每一個常量池項又由兩部分組成,這里分別稱為“常量池項頭”和“常量池項體”。
常量池項頭表明常量池項的類型,常量池項共分為11種類型,分別為:
常量池項類型
值
說明
CONSTANT_Utf8
1
UTF-8編碼的Unicode字符串
CONSTANT_Integer
3
int型常量
CONSTANT_Float
4
Float型常量
CONSTANT_Long
5
Long型常量
CONSTANT_Double
6
double型常量
CONSTANT_Class
7
對一個class的符號引用
CONSTANT_String
8
String型常量
CONSTANT_Fieldref
9
對一個字段的符號引用
CONSTANT_Methodref
10
對一個類方法的符號引用
CONSTANT_InterfaceMedthodref
11
對一個接口方法的符號引用
CONSTANT_NameAndType
12
對名稱和類型的符號引用
常量池項體中存放的就是對應的常量數據,比如各種數值型的常量或者字符串等等。
|