魔數: 文件的開頭的 四個字節 是固定 值位 0xCAFEBABE
java
次版本號( minor version ):二個字節00 00 表示jdk的次版本號
jvm
主版本號( major version ):二個字節 00 34 表示爲jdk的主版本號,34對於10
進製爲52
那麼52表明的是1.8,51表明的是1.7 等等一直類推下去
this
因此經過主次版本號來肯定咱們jdk的版本是1.8.0
spa
常量池入口,佔用二個字節,表示常量池中的個數=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個字節的無符號數
不一樣常量對應的字節碼結構
咱們的常量池能夠看做咱們的java class類的一個資源倉庫(好比Java類定的
方法和變量信息),咱們後面的方法 類的信息的描述信息都是經過索引去常量池中獲
取。
class文件結構
類的訪問權限查詢手冊
字段表結構
方法表中的屬性表attribute_info結構
索引