JVM字節碼文件結構說明

.class字節碼文件結構

image.png

魔數: 文件的開頭的 四個字節 是固定 值位   0xCAFEBABE
image.pngjava

次版本號( minor version ):二個字節00 00 表示jdk的次版本號
image.pngjvm

主版本號( major version ):二個字節 00 34  表示爲jdk的主版本號,34對於10
進製爲52
那麼52表明的是1.8,51表明的是1.7 等等一直類推下去
image.pngthis

因此經過主次版本號來肯定咱們jdk的版本是1.8.0
image.pngspa

常量池入口,佔用二個字節,表示常量池中的個數=00 19 (25)-1=24個, 爲啥
須要-1,由於常量池中的第0個位置被咱們的jvm佔用了表示爲null  因此咱們經過
編譯出來的常量池索引是從1開始的.code

Constant pool:
2  #1 = Methodref #4.#21 // java/lang/Object."<init>":()V
3  #2 = Fieldref #3.#22 // com/tuling/smlz/jvm/classbyatecode/TulingByteCode.u
serName:Ljava/lang/String;
4  #3 = Class #23 // com/tuling/smlz/jvm/classbyatecode/TulingByteCode
5  #4 = Class #24 // java/lang/Object
6  #5 = Utf8 userName
7  #6 = Utf8 Ljava/lang/String;
8  #7 = Utf8 <init>
9  #8 = Utf8 ()V
10  #9 = Utf8 Code
11  #10 = Utf8 LineNumberTable
12  #11 = Utf8 LocalVariableTable
13  #12 = Utf8 this
14  #13 = Utf8 Lcom/tuling/smlz/jvm/classbyatecode/TulingByteCode;
15  #14 = Utf8 getUserName
16  #15 = Utf8 ()Ljava/lang/String;
17  #16 = Utf8 setUserName
18  #17 = Utf8 (Ljava/lang/String;)V
19  #18 = Utf8 MethodParameters
20  #19 = Utf8 SourceFile
21  #20 = Utf8 TulingByteCode.java
22  #21 = NameAndType #7:#8 // "<init>":()V
23  #22 = NameAndType #5:#6 // userName:Ljava/lang/String;
24  #23 = Utf8 com/tuling/smlz/jvm/classbyatecode/TulingByteCode
25  #24 = Utf8 java/lang/Object

常量池結構
u1,u2,u4,u8分別表明1個字節,2個字節,4個字節,8個字節的無符號數
image.png
image.png
不一樣常量對應的字節碼結構
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
咱們的常量池能夠看做咱們的java class類的一個資源倉庫(好比Java類定的
方法和變量信息),咱們後面的方法 類的信息的描述信息都是經過索引去常量池中獲
取。
image.png
class文件結構
image.png
類的訪問權限查詢手冊
image.png
字段表結構
image.png
方法表中的屬性表attribute_info結構
image.png索引

相關文章
相關標籤/搜索