日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

class类文件结构

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 class类文件结构 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • Class 類文件的結(jié)構(gòu)
  • 幻數(shù)和Class文件版本
  • 常量池
  • 訪問標(biāo)志
  • 類索引
  • 父類索引
  • 接口索引集合
  • 字段表集合
    • 訪問標(biāo)識符
    • 簡單名和描述符
  • 方法表集合
    • 屬性表
  • class文件屬性表
  • 腳注
  • 參考資料

Class 類文件的結(jié)構(gòu)

由java源碼編譯后的class文件包含了Java虛擬機(jī)指令和符號表以及若干其他輔助信息。class文件是一組以8位比特(1字節(jié))為單位的二進(jìn)制流,按照大端順序存儲,嚴(yán)格按照順序依次排列下去。

class文件采用類似c語言結(jié)構(gòu)體的偽結(jié)構(gòu)存儲數(shù)據(jù),這種結(jié)構(gòu)只有兩種數(shù)據(jù)類型,無符號數(shù)和表。

無符號數(shù)是基本數(shù)據(jù)類型,可以表示整型、浮點型和字符串字面值等。用u1,u2,u4,u8分別表示1個字節(jié),2個字節(jié),4個字節(jié)和8個字節(jié)的無符號數(shù)。

表是由多個無符號數(shù)和其他表組合成的復(fù)合類型。表類型一般以_info結(jié)尾。

整個class文件結(jié)構(gòu)如下表格1

類型名稱數(shù)量
u4magic1
u2minor_version1
u2major_version1
u2constant_pool_count1
cp_infoconstant_poolconstant_pool_count-1
u2access_flags1
u2this_class1
u2super_class1
u2interfaces_count1
u2interfacesinterfaces_count
u2fields_count1
field_infofieldsfields_count
u2methods_count1
method_infomethodsmethods_count
u2attributes_count1
attribute_infoattributesattributes_count

class文件開始處四個字節(jié)表示magic,緊接著兩個字節(jié)表示minor_version和兩個字節(jié)表示major_version,緊接著兩個字節(jié)表示常量池數(shù)目,緊接著是常量池數(shù)目-1個不同結(jié)構(gòu)的常量表,依次類推。

寫一個簡單的程序,編譯后分析字節(jié)碼。

源碼:

package com.hnzhrh;public class Simple{private int sum = 0;public int add(int a,int b){sum = a + b;return sum;} }

得到的class文件以十六進(jìn)制查看:

幻數(shù)和Class文件版本

class文件格式表格第一行,u4類型的magic一個。

0x0000+0~0x0000+3:CA FE BA BE

該值表示該文件是能被JVM接收的class文件。使用幻數(shù)區(qū)分文件類型而不使用文件后綴名,文件后綴名是可以任意更改的(把jpg改成txt照常還能用畫圖打開,使用幻數(shù)區(qū)分)。

class文件格式表格第二行,u2類型的minor_version一個。

0x0000+4~0x0000+5:00 00

表示次版本號為0。

class文件格式表格第三行,u2類型的major_version一個。

0x0000+6~0x0000+7:00 34

表示主版本號為52。

常量池

常量池主要存放兩大類常量:字面量和符號引用。

符號引用包括了下面三種常量:

  • 類和接口的全限定名
  • 字段的名稱
  • 字段的描述符
  • 方法的名稱
  • 方法的描述符

class文件格式表格第四行,u2類型的constant_pool_count一個。

0x0000+8~0x0000+9:00 13

表示常量池中常量計數(shù),數(shù)值為19。但常量項有18個,該計數(shù)是從1開始的 ??粘鰜淼牡?項用來滿足特定情況下不引用常量池項目的情況,可以指向常量池0項。

緊接著常量計數(shù)之后,就是18個常量項,每個常量項都有自己獨立的表結(jié)構(gòu),表結(jié)構(gòu)的開頭tag標(biāo)志表明了常量類型,如下表2所示:

0x0000+10:0A

查看表可知,tag標(biāo)志為10(0x0A)的常量類型是CONSTANT_Methodref_info,該類型大小為5字節(jié),所以有:

0x0000+10~0x0000+14 為一個CONSTANT_Methodref_info類型常量,也是一個表結(jié)構(gòu)。

通過表查看CONSTANT_Methodref_info類型的結(jié)構(gòu),該結(jié)構(gòu)是由u1類型的tag,u2類型的index(指向聲明方法的類描述符CONSTANT_Class_info的索引項)和u2類型的index(指向名稱及類型描述符CONSTANT_NameAndType的索引項)組成的。

將0x0000+10~0x0000+14劃分成三部分內(nèi)容:

0x0000+10:0A u1類型的tag,值為10。

0x0000+11~0x0000+12:00 04 u2類型的index,值為4。

0x0000+13~0x0000+14:00 0F u2類型的index,值為15。

為了直觀,建立一個表格,#+數(shù)字表示常量池項的索引,后面單元格存放常量項結(jié)構(gòu)的內(nèi)容。如下所示:

常量池標(biāo)號(index)
#0
#110#4#15

其余常量項跟上述類似,最后得到的完整的常量池的直觀表格:

可讀這一列的分析以#1的常量項為例:

至此,常量池的內(nèi)容結(jié)束(0x0000+8~0x0160+5)。

訪問標(biāo)志

class文件格式表格第6行,u2類型的access_flags一個。

0x0160+6~0x0160+7:00 21

訪問標(biāo)志用來表示這個class是類還是接口,是否定義為public,是否定義為abstract等。具有多個屬性則將多個標(biāo)志值或運算得到的結(jié)果作為訪問標(biāo)志。

訪問標(biāo)志表3

標(biāo)志名稱標(biāo)志值含義
ACC_PUBLIC0x0001是否為public
ACC_FINAL0x0010是否為final,只有類可設(shè)置
ACC_SUPER0x0020JDK 1.0.2之后編譯出來的類的這個標(biāo)志為真
ACC_INTERFACE0x0200標(biāo)識是接口
ACC_ABSTRACT0x0400是否為abstract,接口和抽象類為真
ACC_SYNTHETIC0x1000標(biāo)識這個類并非由用戶代碼產(chǎn)生
ACC_ANNOTATION0x2000標(biāo)識這是一個注解
ACC_ENUM0x4000標(biāo)識這是一個枚舉

該class訪問標(biāo)志為0x 0021,表示是一個public類。

類索引

class文件格式表第7行,u2類型的this_class一個。

0x0160+8~0x0160+9:00 03

類索引為0x0003,即指向常量池#3,是一個Class_info類型的常量,表示類或接口的符號引用,該常量的index指向#17,即com/hnzhrh/Simple。

類索引用來確定該類的全限定名。

父類索引

class文件格式表第8行,u2類型的super_class一個。

0x0160+10~0x0160+11:00 04

父類索引為Ox0004,即指向常量池#4,同上分析,得到j(luò)ava/lang/Object。

父類索引用來確定這個類的父類的全限定名。

接口索引集合

class文件格式第9行,u2類型的interface_count一個。

0x0160+12~0x0160+13:00 00

表示接口計數(shù)器,該值為0,則該類沒有實現(xiàn)接口。所以class文件格式第10行的interfaces也沒有。

類索引,父類索引和接口索引集合三者可以表明該類或接口的繼承關(guān)系。

字段表集合

class文件格式第11行,u2類型的fields_count一個。

0x0160+14~0x0160+15:00 01

表示有1個字段表。

字段表不像常量項那樣各有各的結(jié)構(gòu),字段表的結(jié)構(gòu)是統(tǒng)一的,如下表4所示:

類型名稱數(shù)量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

類似上述分析方法,得到如下可讀表格:

類型名稱數(shù)量值可讀
u2access_flags10x00 02private
u2name_index10x00 05sum
u2descriptor_index10x00 06I
u2attributes_count10x00 00
attribute_infoattributesattributes_count

字段類型用于描述接口或者類中聲明的變量。

訪問標(biāo)識符

access_flags可以表明字段所具有的特性,access_flags由下表5所示:

標(biāo)志名稱標(biāo)志值含義
ACC_PUBLIC0x0001是否為public
ACC_PRIVATE0x0002是否為private
ACC_PROTECTED0x0004是否為protected
ACC_STATIC0x0008是否為static
ACC_FINAL0x0010是否為final
ACC_VOLATILE0x0040是否為volatile
ACC_TRANSIENT0x0080是否為transient
ACC_SYNTHETIC0x1000是否由編譯器自動生成
ACC_ENUM0x4000是否為enum

簡單名和描述符

name_index和descriptor_index兩者都為常量池的索引。

name_index為字段的簡單名索引(即不帶有包名的名稱)。

描述符的作用是用來描述字段的數(shù)據(jù)類型,方法的參數(shù)列表(包括數(shù)量、類型和順序)和返回值。

基本數(shù)據(jù)類型和表示無返回值的void的描述符都用一個大寫字母來表示,對象類型則用L加對象的全限定名表示,如下表6

描述符含義
Bbyte
Cchar
Ddouble
Ffloat
Iint
Jlong
Sshort
Zboolean
Vvoid
L對象類型

對于數(shù)組類型,使用一個前置的"["來描述,比如定義一個java.lang.String[][]類型的二維數(shù)組,將被記錄為[Ljava/lang/String;。

字段表集合中不會列出從超類或父接口中繼承而來的字段,但有可能列出原本Java代碼中不存在的字段,比如在內(nèi)部類中為了保持對外部類的訪問性,會自動添加指向外部類實例的字段。

方法表集合

class文件格式第13行,u2類型的methods_count一個。

0x0176+8~0x0176+9:00 02

表示有兩個方法表。

方法表結(jié)構(gòu)與字段表結(jié)構(gòu)一致,如下表7

類型名稱數(shù)量
u2access_flags1
u2name_index1
u2descriptor_index1
u2attributes_count1
attribute_infoattributesattributes_count

方法訪問標(biāo)志與字段訪問標(biāo)志略有不同,如下表8:

標(biāo)志名稱標(biāo)志值含義
ACC_PUBLIC0x0001是否為public
ACC_PRIVATE0x0002是否為private
ACC_PROTECTED0x0004是否為protected
ACC_STATIC0x0008是否為static
ACC_FINAL0x0010是否為final
ACC_SYNCHRONIZED0x0020是否為synchronized
ACC_BRIDGE0x0040是否為編譯器產(chǎn)生的橋接方法
ACC_VARARGS0x0080是否接受不定參數(shù)
ACC_NATIVE0x0100是否為native
ACC_ABSTRACT0x0400是否為abstract
ACC_STRICTFP0x0800是否為strictfp
ACC_SYNTHETIC0x1000是否由編譯器自動生成

如果父類方法沒有被重寫,方發(fā)表中不會出現(xiàn)來自父類的方法,也有可能出現(xiàn)編譯器自動添加的方法,如類構(gòu)造器<clinit>和實列構(gòu)造器<init>方法。

開始分析方法表集合:

0x0176+10~0x0176+11:00 01

該方法是public。

0x0176+12~0x0176+13:00 07

簡單名索引為7,即<init>。

0x0176+14~0x0176+5:00 08

描述符索引為8,即V()。

0x0192+0~0x0192+1:00 01

屬性個數(shù)為1。

接下來就是一個屬性表。

屬性表

在class文件、字段表和方法表都可以攜帶屬性表集合,用于描述某些場景專有的信息。

屬性表開頭都是u2類型的屬性名稱索引和u4類型的屬性長度,緊接著就是不同屬性的結(jié)構(gòu)了。

屬性表中可能包含其他屬性表。

緊接著上述分析:

0x0192+2~0x0192+3:00 09

屬性名稱索引為9,即Code屬性。

0x0192+4~0x0192+7:00 00 00 26

該屬性的長度為38字節(jié)。

Code屬性表9結(jié)構(gòu):

類型名稱數(shù)量
u2attribute_name_index1
u4attribute_length1
u2max_stack1
u2max_locals1
u4code_length1
u1codecode_length
u2exception_table_length1
exception_infoexception_tableexception_table_length
u2attributes_count1
attribute_infoattributesattributes_count

同上分析,可以得到:
max_stack:2,max_locals:1

max_stack代表了操作數(shù)棧深度的最大值,虛擬機(jī)運行時根據(jù)這個值來分配棧幀中操作數(shù)棧大小。

max_locals代表了局部變量表所需的存儲空間,在這里是隱式傳遞給方法的this參數(shù)。

code_length:10

表示字節(jié)碼長度。

code:10字節(jié)長的字節(jié)碼指令,2A B7 00 01 2A 03 B5 00 02 B1

exception_table_length:0

attributes_count:1

表示Code屬性中還有1個屬性。

緊接著就是這個屬性的名稱索引和長度,名稱索引:10,即LineNumberTable,長度:10。

LineNumberTable屬性用于描述Java源行號和字節(jié)碼偏移量之間的對應(yīng)關(guān)系。

LineNumberTable屬性表10結(jié)構(gòu):

類型名稱數(shù)量
u2attribute_name_index1
u4attribute_length1
u2line_number_table_length1
line_number_infoline_number_tableline_number_table_length

line_number_info表包含了兩個u2類型的數(shù)據(jù)項,第一個表示字節(jié)碼行號,第二個表示Java源碼行號。

line_number_table_length : 2

line_number_infor: 0 : 3 和 4 : 4。

至此,<init>方法結(jié)束。

開始分析下一個方法,分析方法類似,分析結(jié)果如下表:

類型名稱值說明
u2access_flags0x00 01public
u2name_index0x00 0Badd
u2descriptor_index0x00 0C(II)I
u2attributes_count0x00 011個屬性
u2attribute_name_index0x00 09Code
u4attribute_length0x00 00 00 28屬性長度40字節(jié)
u2max_stack0x00 03
u2max_locals0x00 03
u4code_length0x00 00 00 0C字節(jié)碼長度12字節(jié)
u1code2A 1B 1C 60 B5 00 02 2A B4 00 02 AC字節(jié)碼
u2exception_table_length0x00 00
exception_infoexception_table
u2attributes_count0x00 01Code屬性的屬性
u2attribute_name_index0x00 0ALineNumberTable
u4attribute_length0x00 00 00 0A屬性長度10字節(jié)
u2line_number_table_length0x00 02有兩個line_number_info
u2start_pc0x00 00字節(jié)碼偏移量
u2line_number0x00 06源碼行號
u2start_pc0x00 07
u2line_number0x00 07

class文件屬性表

在class文件、字段表和方法表都可以攜帶屬性表集合,用于描述某些場景專有的信息。

屬性表開頭都是u2類型的屬性名稱索引和u4類型的屬性長度,緊接著就是不同屬性的結(jié)構(gòu)了。

屬性表中可能包含其他屬性表。

class文件格式表格第15行,u2類型的attributes_count一個。

0x0288+4~0x0288+5:00 01

表示class文件有1個屬性表。

分析方法類似,結(jié)果如下:

類型名稱值說明
u2attribute_name_index0x00 0DSourceFile
u4attribute_length0x00 00 00 02屬性長度2字節(jié)
u2sourcefile_index0x00 0ESimple.java

腳注

參考資料

深入理解Java虛擬機(jī) JVM高級特性與最佳實踐 周志明著 第二版


  • 表格內(nèi)容來源于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-1?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-3和表6-6?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-7?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-8?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-9?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-10?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-11?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-12?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-15?

  • 表格內(nèi)容來源于于《深入理解Java虛擬機(jī) JVM高級特性與最佳實踐》第2版 周志明著 第六章表6-18?

  • 轉(zhuǎn)載于:https://www.cnblogs.com/RohanZhang/p/9510863.html

    總結(jié)

    以上是生活随笔為你收集整理的class类文件结构的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 先锋影音av资源站 | 好吊色视频988gao在线观看 | 91亚洲一线产区二线产区 | 91娇羞白丝网站 | 色偷偷888欧美精品久久久 | 黄色香港三级三级三级 | 最近2019中文字幕大全第二页 | 不卡视频一区二区 | 欧美一区二区三区在线 | 亚洲a图| 伊人中文字幕在线 | 欧美日韩一区二区三区69堂 | 国产艳情片 | 日韩欧美网站 | 久久久久国产精品区片区无码 | 久久高清毛片 | 深夜福利1000 | 91丝袜在线观看 | 久久精品国产亚洲av久一一区 | 99午夜视频 | 欧美日韩免费 | 91国内产香蕉 | 美女福利视频在线 | 国产精品18久久久久久无码 | 亚洲黄色三级视频 | 制服丝袜av在线 | 亚洲成人高清在线 | 国产一级啪啪 | 成人精品在线 | 欧美aaaaaa| 色图一区 | 99色网站| 欧美色v| 午夜剧场福利 | 欧美色图狠狠干 | 日韩一区二区三区不卡视频 | 色图一区| 久久国产精品免费视频 | 黄色网址你懂的 | 亚洲码在线观看 | 99久久国产免费 | 久久性网 | 少妇在军营h文高辣 | 在线免费av播放 | 成人久久影院 | 韩国伦理电影免费在线 | 成人三级在线视频 | 波多野结衣在线观看一区二区三区 | 国产成人亚洲一区二区 | 多毛的亚洲人毛茸茸 | 色妻影院| 日韩欧美黄色片 | 欧美极品少妇xxxxⅹ免费视频 | 性欧美久久| 五月天激情视频在线观看 | 在线观看国产日韩 | 成人私密视频 | 国产福利在线观看视频 | 国产成人无码一区二区在线播放 | 蜜桃成人在线观看 | 欧美1区 | 动漫精品一区一码二码三码四码 | 亚洲痴女 | 777精品伊人久久久久大香线蕉 | 国产探花视频在线观看 | 一区二区福利 | 国产欧美日韩三区 | 欧美一区二区三区影院 | 免费超爽大片黄 | 日韩在线免费观看av | 欧美 日韩 国产 成人 | 91久热| jizz日本女人 | 欧美hdxxxx | 色av综合| 成人免费视频a | 久久这里有精品 | 性欧美成人播放77777 | 91桃色网站 | www.黄色. | 国产日韩欧美精品一区二区 | 成人h动漫精品一区二区器材 | 欧美一区二区三区成人精品 | av黄色一级片 | 三级男人添奶爽爽爽视频 | 亚洲の无码国产の无码步美 | 精品成人一区 | h片在线观看视频 | 国产福利在线免费观看 | 久久99视频 | 伊人av综合 | 中文字幕二区在线观看 | av日韩在线免费观看 | 岛国av网址 | 日韩二区 | 一区二区xxx | 日韩精品中字 | 国产精品亚洲二区在线观看 | 热久久这里只有精品 |