概述
.java 文件被编译器编译为 .class 文件,.class 文件具有特定的数据结构,如下表所示:
每个 .class 文件都是以上表进行排序。
解析一个 .class 文件
使用 javap -verbose 命令可以查看 .class 文件的字节码:
Classfile /E:/01_Code/Clarence_Code/Algorithm/output/zuo/Jvm.classLast modified 2021-7-12; size 587 bytesMD5 checksum 23bdf14592c29c18f8829d63ea6a70fbCompiled from "Jvm.java"public class zuo.Jvmminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPERConstant pool:#1 = Methodref #6.#23 // java/lang/Object."<init>":()V#2 = Fieldref #24.#25 // java/lang/System.out:Ljava/io/PrintStream;#3 = Class #26 // zuo/Jvm#4 = String #27 // Hello World#5 = Methodref #28.#29 // java/io/PrintStream.println:(Ljava/lang/String;)V#6 = Class #30 // java/lang/Object#7 = Utf8 HELLO_WORLD#8 = Utf8 Ljava/lang/String;#9 = Utf8 ConstantValue#10 = Utf8 <init>#11 = Utf8 ()V#12 = Utf8 Code#13 = Utf8 LineNumberTable#14 = Utf8 LocalVariableTable#15 = Utf8 this#16 = Utf8 Lzuo/Jvm;#17 = Utf8 main#18 = Utf8 ([Ljava/lang/String;)V#19 = Utf8 args#20 = Utf8 [Ljava/lang/String;#21 = Utf8 SourceFile#22 = Utf8 Jvm.java#23 = NameAndType #10:#11 // "<init>":()V#24 = Class #31 // java/lang/System#25 = NameAndType #32:#33 // out:Ljava/io/PrintStream;#26 = Utf8 zuo/Jvm#27 = Utf8 Hello World#28 = Class #34 // java/io/PrintStream#29 = NameAndType #35:#36 // println:(Ljava/lang/String;)V#30 = Utf8 java/lang/Object#31 = Utf8 java/lang/System#32 = Utf8 out#33 = Utf8 Ljava/io/PrintStream;#34 = Utf8 java/io/PrintStream#35 = Utf8 println#36 = Utf8 (Ljava/lang/String;)V{public zuo.Jvm();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 3: 0LocalVariableTable:Start Length Slot Name Signature0 5 0 this Lzuo/Jvm;public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: ACC_PUBLIC, ACC_STATICCode:stack=2, locals=1, args_size=10: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;3: ldc #4 // String Hello World5: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V8: returnLineNumberTable:line 7: 0line 8: 8LocalVariableTable:Start Length Slot Name Signature0 9 0 args [Ljava/lang/String;}SourceFile: "Jvm.java"
