【深入理解java虛擬機】第4集--class彙編文件初識

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章