java代码被编译成class文件,class文件的结构分为几部分
1:文件基本信息(大小,修改时间,MD5)
2:版本号,访问标志(public/private)
3:常量池(constant pool)文件中出现的单词,数字等
4:方法区(所有的方法,包括默认生成的构造方法)
5:方法区的异常表(异常范围,异常类型,异常处理)
Classfile /Users/david/Desktop/技术资料/demo/example/web/src/test/java/com/david/example/jvm/SimpleObj.class
Last modified 2019-12-18; size 526 bytes
MD5 checksum c0954e21740d4b44d28f2f42fa2aa9e2
Compiled from "SimpleObj.java"
public class com.david.example.jvm.SimpleObj
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #9.#22 // java/lang/Object."<init>":()V
#2 = Long 100l
#4 = Methodref #23.#24 // java/lang/Thread.sleep:(J)V
#5 = Class #25 // java/lang/InterruptedException
#6 = Methodref #5.#26 // java/lang/InterruptedException.printStackTrace:()V
#7 = Fieldref #8.#27 // com/david/example/jvm/SimpleObj.name:Ljava/lang/String;
#8 = Class #28 // com/david/example/jvm/SimpleObj
#9 = Class #29 // java/lang/Object
#10 = Utf8 name
#11 = Utf8 Ljava/lang/String;
#12 = Utf8 <init>
#13 = Utf8 ()V
#14 = Utf8 Code
#15 = Utf8 LineNumberTable
#16 = Utf8 getName
#17 = Utf8 ()Ljava/lang/String;
#18 = Utf8 StackMapTable
#19 = Class #25 // java/lang/InterruptedException
#20 = Utf8 SourceFile
#21 = Utf8 SimpleObj.java
#22 = NameAndType #12:#13 // "<init>":()V
#23 = Class #30 // java/lang/Thread
#24 = NameAndType #31:#32 // sleep:(J)V
#25 = Utf8 java/lang/InterruptedException
#26 = NameAndType #33:#13 // printStackTrace:()V
#27 = NameAndType #10:#11 // name:Ljava/lang/String;
#28 = Utf8 com/david/example/jvm/SimpleObj
#29 = Utf8 java/lang/Object
#30 = Utf8 java/lang/Thread
#31 = Utf8 sleep
#32 = Utf8 (J)V
#33 = Utf8 printStackTrace
{
public com.david.example.jvm.SimpleObj();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 9: 0
public java.lang.String getName();
descriptor: ()Ljava/lang/String;
flags: ACC_PUBLIC
Code:
stack=2, locals=2, args_size=1
0: ldc2_w #2 // long 100l
3: invokestatic #4 // Method java/lang/Thread.sleep:(J)V
6: goto 14
9: astore_1
10: aload_1
11: invokevirtual #6 // Method java/lang/InterruptedException.printStackTrace:()V
14: aload_0
15: getfield #7 // Field name:Ljava/lang/String;
18: areturn
Exception table:
from to target type
0 6 9 Class java/lang/InterruptedException
LineNumberTable:
line 14: 0
line 17: 6
line 15: 9
line 16: 10
line 18: 14
StackMapTable: number_of_entries = 2
frame_type = 73 /* same_locals_1_stack_item */
stack = [ class java/lang/InterruptedException ]
frame_type = 4 /* same */
}
SourceFile: "SimpleObj.java"
冯诺伊曼计算机由存储器,控制器,运算器,输入,输出五部分组成。
而系统能够正常执行是由控制器执行方法区的指令代码完成的,比如我们上面的getName()方法
Code部分:
code下面就是java的汇编指令,对应着计算机的指令集。所以,读懂class文档的汇编指令,就能读懂代码真正的运行步骤。比如Lock同步代码是怎么保证线程同步,java字节码增强到底做了什么。所有的疑惑都能在class的汇编文件里找到答案