.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>":()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 构造