Java是一種動(dòng)態(tài)連接的語(yǔ)言,常量池的作用非常重要,常量池中除了包含代碼中所定義的各種基本類型(如int、long等等)和對(duì)象型(如String及數(shù)組)的常量值還,還包含一些以文本形式出現(xiàn)的符號(hào)引用,比如:
類和接口的全限定名;
字段的名稱和描述符;
方法和名稱和描述符。
在C語(yǔ)言中,如果一個(gè)程序要調(diào)用其它庫(kù)中的函數(shù),在連接時(shí),該函數(shù)在庫(kù)中的位置(即相對(duì)于庫(kù)文件開(kāi)頭的偏移量)會(huì)被寫(xiě)在程序中,在運(yùn)行時(shí),直接去這個(gè)地址調(diào)用函數(shù);新疆軟件開(kāi)發(fā)網(wǎng) 而在Java語(yǔ)言中不是這樣,一切都是動(dòng)態(tài)的。編譯時(shí),如果發(fā)現(xiàn)對(duì)其它類方法的調(diào)用或者對(duì)其它類字段的引用的話,記錄進(jìn)class文件中的,只能是一個(gè)文本形式的符號(hào)引用,在連接過(guò)程中,虛擬機(jī)根據(jù)這個(gè)文本信息去查找對(duì)應(yīng)的方法或字段。
所以,與Java語(yǔ)言中的所謂“常量”不同,class文件中的“常量”內(nèi)容很非富,這些常量集中在class中的一個(gè)區(qū)域存放,一個(gè)緊接著一個(gè),這里就稱為“常量池”。
常量池由多條“常量池項(xiàng)”組成,每一個(gè)常量池項(xiàng)又由兩部分組成,這里分別稱為“常量池項(xiàng)頭”和“常量池項(xiàng)體”。
常量池項(xiàng)頭表明常量池項(xiàng)的類型,常量池項(xiàng)共分為11種類型,分別為:
常量池項(xiàng)類型
值
說(shuō)明
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
對(duì)一個(gè)class的符號(hào)引用
CONSTANT_String
8
String型常量
CONSTANT_Fieldref
9
對(duì)一個(gè)字段的符號(hào)引用
CONSTANT_Methodref
10
對(duì)一個(gè)類方法的符號(hào)引用
CONSTANT_InterfaceMedthodref
11
對(duì)一個(gè)接口方法的符號(hào)引用
CONSTANT_NameAndType
12
對(duì)名稱和類型的符號(hào)引用
常量池項(xiàng)體中存放的就是對(duì)應(yīng)的常量數(shù)據(jù),比如各種數(shù)值型的常量或者字符串等等。
|