【深入理解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的汇编文件里找到答案

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