Javaclass文件格式之常量池_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)

常量池中各數(shù)據(jù)項類型詳解

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設,運城企業(yè)網(wǎng)站建設,運城品牌網(wǎng)站建設,網(wǎng)站定制,運城網(wǎng)站建設報價,網(wǎng)絡營銷,網(wǎng)絡優(yōu)化,運城網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。

常量池中的數(shù)據(jù)項是通過索引來引用的, 常量池中的各個數(shù)據(jù)項之間也會相互引用。在這11中常量池數(shù)據(jù)項類型中, 有兩種比較基礎(chǔ), 之所以說它們基礎(chǔ), 是因為這兩種類型的數(shù)據(jù)項會被其他類型的數(shù)據(jù)項引用。 這兩種數(shù)據(jù)類型就是CONSTANT_Utf8 和 CONSTANT_NameAndType , 其中CONSTANT_NameAndType類型的數(shù)據(jù)項(CONSTANT_NameAndType_info)也會引用CONSTANT_Utf8類型的數(shù)據(jù)項(CONSTANT_Utf8_info) 。 與其他介紹常量池的書籍或其他資料不同, 本著循序漸進和先后分明的原則, 我們首先對這兩種比較基本的類型的數(shù)據(jù)項進行介紹, 然后再依次介紹其他9中數(shù)據(jù)項。 


(1) CONSTANT_Utf8_info


一個CONSTANT_Utf8_info是一個CONSTANT_Utf8類型的常量池數(shù)據(jù)項, 它存儲的是一個常量字符串。 常量池中的所有字面量幾乎都是通過CONSTANT_Utf8_info描述的。下面我們首先講解CONSTANT_Utf8_info數(shù)據(jù)項的存儲格式。在前面的文章中, 我們提到, 常量池中數(shù)據(jù)項的類型由一個整型的標志值(tag)決定, 所以所有常量池類型的info中都必須有一個tag信息, 并且這個tag值位于數(shù)據(jù)項的第一個字節(jié)上。 一個11中常量池數(shù)據(jù)類型, 所以就有11個tag值表示這11中類型。而CONSTANT_Utf8_info的tag值為1, 也就是說如果虛擬機要解析一個常量池數(shù)據(jù)項, 首先去讀這個數(shù)據(jù)項的第一個字節(jié)的tag值, 如果這個tag值為1, 那么就說明這個數(shù)據(jù)項是一個CONSTANT_Utf8類型的數(shù)據(jù)項。 緊挨著tag值的兩個字節(jié)是存儲的字符串的長度length, 剩下的字節(jié)就存儲著字符串。 所以, 它的格式是這樣的:

其中tag占一個字節(jié), length占2個字節(jié), bytes代表存儲的字符串, 占length字節(jié)。所以, 如果這個CONSTANT_Utf8_info存儲的是字符串"Hello", 那么他的存儲形式是這樣的:

現(xiàn)在我們知道了CONSTANT_Utf8_info數(shù)據(jù)項的存儲形式, 那么CONSTANT_Utf8_info數(shù)據(jù)項都存儲了什么字符串呢? CONSTANT_Utf8_info可包括的字符串主要以下這些:


  • 程序中的字符串常量
  • 常量池所在當前類(包括接口和枚舉)的全限定名
  • 常量池所在當前類的直接父類的全限定名
  • 常量池所在當前類型所實現(xiàn)或繼承的所有接口的全限定名
  • 常量池所在當前類型中所定義的字段的名稱和描述符
  • 常量池所在當前類型中所定義的方法的名稱和描述符
  • 由當前類所引用的類型的全限定名
  • 由當前類所引用的其他類中的字段的名稱和描述符
  • 由當前類所引用的其他類中的方法的名稱和描述符
  • 與當前class文件中的屬性相關(guān)的字符串, 如屬性名等

總結(jié)一下, 其中有這么五類: 程序中的字符串常量, 類型的全限定名, 方法和字段的名稱, 方法和字段的描述符, 屬性相關(guān)字符串。 程序中的字符串常量不用多說了, 我們經(jīng)常使用它們創(chuàng)建字符串對象, 屬性相關(guān)的字符串, 等到講到class中的屬性信息(attibute)時自會提及。 方法和字段的名稱也不用多說了 。 剩下的就是類型的全限定名,方法和字段的描述符 。 還有一點需要說明, 類型的全限定名, 方法和字段的名稱, 方法和字段的描述符, 可以是本類型中定義的, 也可能是本類中引用的其他類的。 


下面我們通過一個例子來進行說明。 示例源碼:


package com.jg.zhang;

public class Programer extends Person {

 static String company = "CompanyA";
 
 static{
 System.out.println("staitc init");
 }
 
 
 String position;
 Computer computer;

 public Programer() {
 this.position = "engineer";
 this.computer = new Computer();
 }
 
 public void working(){
 System.out.println("coding...");
 computer.working();
 }
}

文章標題:Javaclass文件格式之常量池_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)
地址分享:http://muchs.cn/article40/dchceo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、移動網(wǎng)站建設、定制開發(fā)、用戶體驗、App設計、面包屑導航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)