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的彙編文件裏找到答案