一:字節碼結構組成部分:
結構層 | 佔用字節 | 說明 | |
魔數 | Magic Number | 4 | oxCAFEBABE |
次版本號 | minor version | 2 | |
主版本號 | major version | 2 | java8對應52 |
常量池常量個數 | constant pool count | 2 | |
常量池表 | Constant Pool | 常量個數-1 | 標識出所有當前類所用的的信息,組成列表一一對應 PS: 常量0:表示null,作爲保留字段,並沒有列入常量池 |
類訪問標識符 | Access Flags | 2 | 描述當前類的訪問控制權限 |
當前類名 | This Class Name | 2 | |
當前類的父類名 | Super Class Name | 2 | |
實現接口個數 | interfaces count | 2 | |
當前類實現的接口名 | Interfaces | 接口個數 | PS:如果實現的接口個數是0,則無此項信息 |
屬性字段信息個數 | fields count | 2 | |
屬性字段信息 | Fields | fields count | |
方法個數 | methods count | 2 | |
方法信息 | Methods | methods count | |
附加屬性的個數 | attributes count | 2 | |
屬性 | Attributes | attributes count |
二:字節碼常量池數組結構類型:
項目 | 佔用字符 | 描述 |
tag | 1 | 值爲1 (UTF-8編碼的字符串) |
length | 2 | UTF-8 編碼的字符串長度 |
bytes | 1 | 長度爲leng 的UTF-8的編碼字符串 |
tag | 1 | 值爲3(整形字面量) |
bytes | 4 | 按照高位在前存儲的int值 |
tag | 1 | 值爲4(浮點型字面量) |
bytes | 4 | 按照高位在前存儲的float值 |
tag | 1 | 值爲5(長整型字面量) |
bytes | 8 | 按照高位在前存儲的long值 |
tag | 1 | 值爲6(雙精度浮點型字面量) |
bytes | 8 | 按照高位在前存儲的double值 |
tag | 1 | 值爲7(類或接口的符號引用) |
bytes | 2 | 指向全限定名常量項的索引 |
tag | 1 | 值爲8(字符串類型字面量) |
bytes | 2 | 指向字符串字面量的索引 |
tag | 1 | 值爲9(字段的符號引用) |
index | 2 | 指向聲明字段的婁或者接口描述符Constant_class_info的索引項 |
index | 2 | 指向字段描述符Constant_nameAndType_info的索引項 |
tag | 1 | 值爲10(類中方法的符號引用) |
index | 2 | 指向聲明方法的類描述符Constant_Class_info 的索引項 |
index | 2 | 指向名稱及類型描述符Constant_nameAndType_info的索引項 |
tag | 1 | 值爲11(接口中方法的符號引用) |
index | 2 | 指向聲明方法的接口描述符Constant_class_info的索引項 |
index | 2 | 指向名稱及類型描述符Constant_nameAndType_info的索引項 |
tag | 1 | 值爲12(字段或方法的符號引用) |
index | 2 | 指向該字段或方法名稱常量項的索引 |
index | 2 | 指向該字段或方法描述符常量項的索引 |
tag | 1 | 值爲15(表示方法句柄) |
refefence_kind | 1 | 值必須爲[1,9]的範圍,表示方法句柄的字節碼行爲 |
reference_index | 2 | 指向常量池的索引 |
tag | 1 | 值爲16(標誌方法類型) |
descriptor_index | 2 | 指向常量池的索引,表示方法的描述符 |
tag | 1 | 值爲18(表示一個動態方法調用點) |
boostrap_method_attr_index | 2 | 值必須是對當前Class文件中引導方法表的bootrap_method[]數組的有效索引 |
name_and_type_index | 2 | 指向常量池的索引,表示方法名和方法描述符 |
三:java 字節碼中類,屬性,方法的訪問標識符:
PS: 類的訪問標識是通過以上8種之間進行與(|)運算得出來的結果,比如0x0011,它表示 該類是一個public且爲final 修辭的類
四:字段表結構:
名稱 | 佔用字節 | 描述 |
access_flag | 2 | 訪問標識 |
name_index | 2 | 字段名索引值 |
descriptor_index | 2 | 字段描述索引值 |
attributes_count | 2 | 附加屬性個數 |
attributes | n | 附加屬性結構,如果屬性個數爲0,則當前結構不存在 |
五:方法表信息結構:
名稱 | 佔用字節 | 描述 | |||
access_flag | 2 | 訪問標識 | |||
name_index | 2 | 方法名索引值 | |||
descriptor_index | 2 | 方法描述索引值 | |||
attributes_count | 2 | 附加屬性個數 | |||
attributes | n | 附加屬性結構,如果屬性個數爲0,則當前結構不存在 | |||
Code | attribute_name_index | 2 | 附加屬性名索引值 | ||
attribute_length | 4 | 附加屬性長度,表示後面存在該長度個字節 | |||
max_stack | 2 | 表示方法運行的任何時刻所能達到的操作數棧最大深度 | |||
max_locals | 2 | 表示局部變量表所需的存儲空間,單位是Slot | |||
code_length | 4 | 表示該方法所包含的字節碼的字節數以及具體的指令碼 | |||
code[code_length] | code_length | code_length有多大,表示這裏面就有多少個指令 | |||
exception_table_length | 2 | 異常表長度(個數) | |||
exception_table | start_pc | 2 | start_pc 和end_pc 表示在code 數組中的從start_pc 到end_pc(前包後不包) 處的指令拋出的異常會由這個表項來處理 | ||
end_pc | 2 | ||||
handler_pc | 2 | 表示處理異常的代碼開始處 | |||
catch_type | 2 | 表示會被處理的異常類型,它指向常量池的一個異常類。當catch_type爲0時,表示處理所有的異常 | |||
attribute_count | 2 | 附加屬性表個數 | |||
LineNumberTable (這個屬性用來表示code數組中的字節碼和java代碼行數之間的關係,在調試程序時用來定位執行代碼行數) |
attribute_name_index | 2 | 附加屬性名索引值 | ||
attribute_length | 4 | 附加屬性長度 | |||
line_number_table_length | 2 | line_number_table 的長度 | |||
line_number_table | start_pc | 2 | 字節碼行號 | ||
line_number | 2 | 源代碼行號 | |||
LocalVariableTable (描述棧幀中局部變量表中的變量與Java源碼中定義的變量之間的關係) |
attribute_name_index | 2 | 附加屬性名索引值 | ||
attribute_length | 4 | 附加屬性長度 | |||
local_variable_table_length | 2 | 局部變量表個數 | |||
local_variable_table | start_pc | 2 | 表示局部變量的生命週期開始的字節碼偏移量 | ||
length | 2 | 表示局部變量的生命週期開始的字節碼作用範圍覆蓋的長度 | |||
name_index | 2 | 指向常量池索引,表示局部變量名稱 | |||
Descriptor_index | 2 | 指向常量池索引,表示局部變量的描述符 | |||
index | 2 | 描述局部變量在棧幀局部變量表中Slot的位置 |
六:屬性表包含的屬性及其所屬結構位置
屬性名稱 | 使用位置 | 含義 |
Code | 方法表 | Java代碼編譯成的字節碼指令 |
ConstantValue | 字段表 | final關鍵字定義的常量池 |
Deprecated | 類,方法,字段表 | 被聲明爲deprecated的方法和字段 |
Exceptions | 方法表 | 方法拋出的異常 |
EnclosingMethod | 類文件 | 僅當一個類爲局部類或者匿名類是才能擁有這個屬性,這個屬性用於標識這個類所在的外圍方法 |
InnerClass | 類文件 | 內部類列表 |
LineNumberTable | Code屬性 | Java源碼的行號與字節碼指令的對應關係 |
LocalVariableTable | Code屬性 | 方法的局部便狼描述 |
StackMapTable | Code屬性 | JDK1.6中新增的屬性,供新的類型檢查檢驗器檢查和處理目標方法的局部變量和操作數有所需要的類是否匹配 |
Signature | 類,方法表,字段表 | 用於支持泛型情況下的方法簽名 |
SourceFile | 類文件 | 記錄源文件名稱 |
SourceDebugExtension | 類文件 | 用於存儲額外的調試信息 |
Synthetic | 類,方法表,字段表 | 標誌方法或字段爲編譯器自動生成的 |
LocalVariableTypeTable | 類 | 使用特徵簽名代替描述符,是爲了引入泛型語法之後能描述泛型參數化類型而添加 |
RuntimeVisibleAnnotations | 類,方法表,字段表 | 爲動態註解提供支持 |
RuntimeInvisibleAnnotations | 表,方法表,字段表 | 用於指明哪些註解是運行時不可見的 |
RuntimeVisibleParameterAnnotation | 方法表 | 作用與RuntimeVisibleAnnotations屬性類似,只不過作用對象爲方法 |
RuntimeInvisibleParameterAnnotation | 方法表 | 作用與RuntimeInvisibleAnnotations屬性類似,作用對象哪個爲方法參數 |
AnnotationDefault | 方法表 | 用於記錄註解類元素的默認值 |
BootstrapMethods | 類文件 | 用於保存invokeddynamic指令引用的引導方式限定符 |
七:各種屬性的數據結構:
其基本結構:
類型 | 名稱 | 數量 |
u2 | attribute_name_index | 1 |
u4 | attribute_length | 1 |
u1 | info | attribute_length |
具體結構類型如下:
屬性類別 | 名稱 | 佔用字節 | 描述 | |
SourceFile | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數 | ||
sourcefile_index | 2 | 源文件名,其值指向常量池的第n個常量 | ||
ConstantValue | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 該值必須固定爲2 | ||
constantvalue_index | 2 | 指向常量池字面量常量 | ||
InnerClasses | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數 | ||
number_of_classes | 2 | 表示需要記錄多少個內部類信息 | ||
inner_classes_info | inner_class_info_index | 2 | 表示指向內部類的符號引用,其值指向常量池第n個常量 | |
outer_class_info_index | 2 | 表示指向宿主類的符號引用,其值指向常量池第n個常量 | ||
inner_name_index | 2 | 表示內部類名稱,其值指向常量池第n個常量,如果是匿名內部類,則該值爲0 | ||
inner_class_access_flags | 2 | 內部類訪問標誌,與類訪問標識類似 | ||
Deprecated | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數,該值固定爲:0x00000000 | ||
Synthetic | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數,該值固定爲:0x00000000 | ||
StackMapTable | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數 | ||
number_of_entries | 2 | 棧映射表個數 | ||
stack_map_frame_entries | number_of_entries | 棧映射表信息 | ||
Signature | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數 | ||
signature_index | 2 | 表示類簽名,方法類型簽名或字段類型簽名,指向常量池的常量 | ||
BootstrapMethods | attribute_name_index | 2 | 屬性名,其值指向常量池的第n個常量 | |
attribute_length | 4 | 屬性長度後面所佔字節數 | ||
num_bootstrap_methods | 2 | bootsrap_methods 的個數 | ||
bootstrap_method | bootstrap_method_ref | 2 | 指向常量索引,並且該索引類型必須是:CONSTANT_MethodHandle_info 結構 | |
num_bootsrap_arguments | 2 | 表示bootstrap_arguments 數組的個數 | ||
bootstrap_arguments | 2 | bootsrap_arguments 數組中指向常量池的有效索引 |