.class字节码文件构造

魔数: 文件的结尾的 四个字节 是固定 值位   0xCAFEBABE

次版本号( minor version ):二个字节00 00 示意jdk的次版本号

主版本号( major version ):二个字节 00 34  示意为jdk的主版本号,34对于10
进制为52
那么52代表的是1.8,51代表的是1.7 等等始终类推上来

所以通过主次版本号来确定咱们jdk的版本是1.8.0

常量池入口,占用二个字节,示意常量池中的个数=00 19 (25)-1=24个, 为啥
须要-1,因为常量池中的第0个地位被咱们的jvm占用了示意为null  所以咱们通过
编译进去的常量池索引是从1开始的.

Constant pool:2  #1 = Methodref #4.#21 // java/lang/Object."<init>":()V3  #2 = Fieldref #3.#22 // com/tuling/smlz/jvm/classbyatecode/TulingByteCode.userName:Ljava/lang/String;4  #3 = Class #23 // com/tuling/smlz/jvm/classbyatecode/TulingByteCode5  #4 = Class #24 // java/lang/Object6  #5 = Utf8 userName7  #6 = Utf8 Ljava/lang/String;8  #7 = Utf8 <init>9  #8 = Utf8 ()V10  #9 = Utf8 Code11  #10 = Utf8 LineNumberTable12  #11 = Utf8 LocalVariableTable13  #12 = Utf8 this14  #13 = Utf8 Lcom/tuling/smlz/jvm/classbyatecode/TulingByteCode;15  #14 = Utf8 getUserName16  #15 = Utf8 ()Ljava/lang/String;17  #16 = Utf8 setUserName18  #17 = Utf8 (Ljava/lang/String;)V19  #18 = Utf8 MethodParameters20  #19 = Utf8 SourceFile21  #20 = Utf8 TulingByteCode.java22  #21 = NameAndType #7:#8 // "<init>":()V23  #22 = NameAndType #5:#6 // userName:Ljava/lang/String;24  #23 = Utf8 com/tuling/smlz/jvm/classbyatecode/TulingByteCode25  #24 = Utf8 java/lang/Object

常量池构造
u1,u2,u4,u8别离代表1个字节,2个字节,4个字节,8个字节的无符号数


不同常量对应的字节码构造











咱们的常量池能够看作咱们的java class类的一个资源仓库(比方Java类定的
办法和变量信息),咱们前面的办法 类的信息的形容信息都是通过索引去常量池中获
取。

class文件构造

类的拜访权限查问手册

字段表构造

办法表中的属性表attribute_info构造