zoukankan      html  css  js  c++  java
  • JVM指令分析

    代码:

    1 public class AppGo{
    2  public static void test() {
    3   boolean flag = true;
    4   if (flag) System.out.println("Hello, Java!");
    5   if (flag == true) System.out.println("Hello, JVM!");
    6  }
    7 }

    javac -g AppGo.java

    javap -p -v AppGo.class

    Classfile /code/asmtoolsTest/AppGo.class
      Last modified 2020-11-16; size 549 bytes
      MD5 checksum 080f0b86a8d6f3f00b616181e3b05973
      Compiled from "AppGo.java"
    public class AppGo
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #7.#21         // java/lang/Object."<init>":()V
       #2 = Fieldref           #22.#23        // java/lang/System.out:Ljava/io/PrintStream;
       #3 = String             #24            // Hello, Java!
       #4 = Methodref          #25.#26        // java/io/PrintStream.println:(Ljava/lang/String;)V
       #5 = String             #27            // Hello, JVM!
       #6 = Class              #28            // AppGo
       #7 = Class              #29            // java/lang/Object
       #8 = Utf8               <init>
       #9 = Utf8               ()V
      #10 = Utf8               Code
      #11 = Utf8               LineNumberTable
      #12 = Utf8               LocalVariableTable
      #13 = Utf8               this
      #14 = Utf8               LAppGo;
      #15 = Utf8               test
      #16 = Utf8               flag
      #17 = Utf8               Z
      #18 = Utf8               StackMapTable
      #19 = Utf8               SourceFile
      #20 = Utf8               AppGo.java
      #21 = NameAndType        #8:#9          // "<init>":()V
      #22 = Class              #30            // java/lang/System
      #23 = NameAndType        #31:#32        // out:Ljava/io/PrintStream;
      #24 = Utf8               Hello, Java!
      #25 = Class              #33            // java/io/PrintStream
      #26 = NameAndType        #34:#35        // println:(Ljava/lang/String;)V
      #27 = Utf8               Hello, JVM!
      #28 = Utf8               AppGo
      #29 = Utf8               java/lang/Object
      #30 = Utf8               java/lang/System
      #31 = Utf8               out
      #32 = Utf8               Ljava/io/PrintStream;
      #33 = Utf8               java/io/PrintStream
      #34 = Utf8               println
      #35 = Utf8               (Ljava/lang/String;)V
    {
      public AppGo();
        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 2: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   LAppGo;
    
      public static void test();
        descriptor: ()V
        flags: ACC_PUBLIC, ACC_STATIC                                                           局部变量表      操作数栈
        Code:
          stack=2, locals=1, args_size=0 
             0: iconst_1                             //    将int型值1入操作数栈                     null            1
             1: istore_0                          // 从操作数栈顶出栈一个int型值存入局部变量0号位置      1              null
             2: iload_0                           //  从局部变量0号位置加载一个int型值入操作数栈         1               1
             3: ifeq          14        // 从操作数栈出栈1个数,跟0比较(ifeq),相等则跳过if后面的语句    1              null
             6: getstatic     #2   // Field java/lang/System.out:Ljava/io/PrintStream;          
             9: ldc           #3   // String Hello, Java!
            11: invokevirtual #4   // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            14: iload_0            // 从局部变量0号位置加载一个int型值入操作数栈                        1                1
            15: iconst_1           // 将int型值1入操作数栈                                          1                1, 1
            16: if_icmpne     27   // 从操作数栈栈顶出2个int,如果不相等(if_icmpne),则跳过if后面的语句  1               null
            19: getstatic     #2  // Field java/lang/System.out:Ljava/io/PrintStream;
            22: ldc           #5  // String Hello, JVM!
            24: invokevirtual #4  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            27: return
          LineNumberTable:
            line 4: 0
            line 5: 2
            line 6: 14
            line 7: 27
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                2      26     0  flag   Z
          StackMapTable: number_of_entries = 2
            frame_type = 252 /* append */
              offset_delta = 14
              locals = [ int ]
            frame_type = 12 /* same */
    }
    SourceFile: "AppGo.java"

    代码:只有main函数

    1 public class App{
    2  public static void main(String[] args) {
    3   boolean flag = true;
    4   if (flag) System.out.println("Hello, Java!");
    5   if (flag == true) System.out.println("Hello, JVM!");
    6  }
    7 }

    javap -p -v App.class

    Classfile /code/asmtoolsTest/App.class
      Last modified 2020-11-16; size 607 bytes
      MD5 checksum 9b49845cb53676cdb7e8bdd478ffd9b9
      Compiled from "App.java"
    public class App
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #7.#24         // java/lang/Object."<init>":()V
       #2 = Fieldref           #25.#26        // java/lang/System.out:Ljava/io/PrintStream;
       #3 = String             #27            // Hello, Java!
       #4 = Methodref          #28.#29        // java/io/PrintStream.println:(Ljava/lang/String;)V
       #5 = String             #30            // Hello, JVM!
       #6 = Class              #31            // App
       #7 = Class              #32            // java/lang/Object
       #8 = Utf8               <init>
       #9 = Utf8               ()V
      #10 = Utf8               Code
      #11 = Utf8               LineNumberTable
      #12 = Utf8               LocalVariableTable
      #13 = Utf8               this
      #14 = Utf8               LApp;
      #15 = Utf8               main
      #16 = Utf8               ([Ljava/lang/String;)V
      #17 = Utf8               args
      #18 = Utf8               [Ljava/lang/String;
      #19 = Utf8               flag
      #20 = Utf8               Z
      #21 = Utf8               StackMapTable
      #22 = Utf8               SourceFile
      #23 = Utf8               App.java
      #24 = NameAndType        #8:#9          // "<init>":()V
      #25 = Class              #33            // java/lang/System
      #26 = NameAndType        #34:#35        // out:Ljava/io/PrintStream;
      #27 = Utf8               Hello, Java!
      #28 = Class              #36            // java/io/PrintStream
      #29 = NameAndType        #37:#38        // println:(Ljava/lang/String;)V
      #30 = Utf8               Hello, JVM!
      #31 = Utf8               App
      #32 = Utf8               java/lang/Object
      #33 = Utf8               java/lang/System
      #34 = Utf8               out
      #35 = Utf8               Ljava/io/PrintStream;
      #36 = Utf8               java/io/PrintStream
      #37 = Utf8               println
      #38 = Utf8               (Ljava/lang/String;)V
    {
      public App();
        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 2: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   LApp;
    
      public static void main(java.lang.String[]);
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=2, locals=2, args_size=1
             0: iconst_1                  //    将int型值1入操作数栈
             1: istore_1                  // 从操作数栈顶出栈一个int型值存入局部变量1号位置
             2: iload_1                    //  从局部变量1号位置加载一个int型值入操作数栈 
             3: ifeq          14
             6: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
             9: ldc           #3                  // String Hello, Java!
            11: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            14: iload_1
            15: iconst_1
            16: if_icmpne     27
            19: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            22: ldc           #5                  // String Hello, JVM!
            24: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            27: return
          LineNumberTable:
            line 4: 0
            line 5: 2
            line 6: 14
            line 7: 27
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      28     0  args   [Ljava/lang/String;
                2      26     1  flag   Z
          StackMapTable: number_of_entries = 2
            frame_type = 252 /* append */
              offset_delta = 14
              locals = [ int ]
            frame_type = 12 /* same */
    }
    SourceFile: "App.java"

    代码:

     1 package javap;
     2 
     3 public class FinallyTest {
     4 
     5     public static int test1(int a) {
     6         try {
     7             a += 20;
     8             return a;
     9         } finally {
    10             a += 30;
    11             return a;
    12         }
    13     }
    14 
    15 
    16     public static int test2(int b) {
    17         try {
    18             b += 20;
    19             return b;
    20         } finally {
    21             b += 30;
    22             System.out.println("第2个输出=" + b);  // 第2个输出
    23         }
    24     }
    25 
    26     public static void main(String[] args) {
    27         int num = 10;
    28         System.out.println("第1个输出=" + test1(num));  // 第1个输出
    29         System.out.println("第3个输出=" + test2(num));  // 第3个输出
    30     }
    31 
    32 
    33 
    34 }
    Classfile 
    /code/testDemo/src/main/java/javap/FinallyTest.class
      Last modified 2020-11-13; size 1226 bytes
      MD5 checksum e4e416c02fb7fec3ea5aef440dd9b403
      Compiled from "FinallyTest.java"
    public class javap.FinallyTest
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #15.#38        // java/lang/Object."<init>":()V
       #2 = Fieldref           #39.#40        // java/lang/System.out:Ljava/io/PrintStream;
       #3 = Class              #41            // java/lang/StringBuilder
       #4 = Methodref          #3.#38         // java/lang/StringBuilder."<init>":()V
       #5 = String             #42            // 第2个输出=
       #6 = Methodref          #3.#43         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       #7 = Methodref          #3.#44         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
       #8 = Methodref          #3.#45         // java/lang/StringBuilder.toString:()Ljava/lang/String;
       #9 = Methodref          #46.#47        // java/io/PrintStream.println:(Ljava/lang/String;)V
      #10 = String             #48            // 第1个输出=
      #11 = Methodref          #14.#49        // javap/FinallyTest.test1:(I)I
      #12 = String             #50            // 第3个输出=
      #13 = Methodref          #14.#51        // javap/FinallyTest.test2:(I)I
      #14 = Class              #52            // javap/FinallyTest
      #15 = Class              #53            // java/lang/Object
      #16 = Utf8               <init>
      #17 = Utf8               ()V
      #18 = Utf8               Code
      #19 = Utf8               LineNumberTable
      #20 = Utf8               LocalVariableTable
      #21 = Utf8               this
      #22 = Utf8               Ljavap/FinallyTest;
      #23 = Utf8               test1
      #24 = Utf8               (I)I
      #25 = Utf8               a
      #26 = Utf8               I
      #27 = Utf8               StackMapTable
      #28 = Class              #54            // java/lang/Throwable
      #29 = Utf8               test2
      #30 = Utf8               b
      #31 = Utf8               main
      #32 = Utf8               ([Ljava/lang/String;)V
      #33 = Utf8               args
      #34 = Utf8               [Ljava/lang/String;
      #35 = Utf8               num
      #36 = Utf8               SourceFile
      #37 = Utf8               FinallyTest.java
      #38 = NameAndType        #16:#17        // "<init>":()V
      #39 = Class              #55            // java/lang/System
      #40 = NameAndType        #56:#57        // out:Ljava/io/PrintStream;
      #41 = Utf8               java/lang/StringBuilder
      #42 = Utf8               第2个输出=
      #43 = NameAndType        #58:#59        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      #44 = NameAndType        #58:#60        // append:(I)Ljava/lang/StringBuilder;
      #45 = NameAndType        #61:#62        // toString:()Ljava/lang/String;
      #46 = Class              #63            // java/io/PrintStream
      #47 = NameAndType        #64:#65        // println:(Ljava/lang/String;)V
      #48 = Utf8               第1个输出=
      #49 = NameAndType        #23:#24        // test1:(I)I
      #50 = Utf8               第3个输出=
      #51 = NameAndType        #29:#24        // test2:(I)I
      #52 = Utf8               javap/FinallyTest
      #53 = Utf8               java/lang/Object
      #54 = Utf8               java/lang/Throwable
      #55 = Utf8               java/lang/System
      #56 = Utf8               out
      #57 = Utf8               Ljava/io/PrintStream;
      #58 = Utf8               append
      #59 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
      #60 = Utf8               (I)Ljava/lang/StringBuilder;
      #61 = Utf8               toString
      #62 = Utf8               ()Ljava/lang/String;
      #63 = Utf8               java/io/PrintStream
      #64 = Utf8               println
      #65 = Utf8               (Ljava/lang/String;)V
    {
      public javap.FinallyTest();
        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 3: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   Ljavap/FinallyTest;
    
      public static int test1(int);
        descriptor: (I)I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=1, locals=3, args_size=1
             0: iinc          0, 20
             3: iload_0
             4: istore_1
             5: iinc          0, 30
             8: iload_0
             9: ireturn
            10: astore_2
            11: iinc          0, 30
            14: iload_0
            15: ireturn
          Exception table:
             from    to  target type
                 0     5    10   any
          LineNumberTable:
            line 7: 0
            line 8: 3
            line 10: 5
            line 11: 8
            line 10: 10
            line 11: 14
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      16     0     a   I
          StackMapTable: number_of_entries = 1
            frame_type = 74 /* same_locals_1_stack_item */
              stack = [ class java/lang/Throwable ]
    
      public static int test2(int);
        descriptor: (I)I
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=3, locals=3, args_size=1
             0: iinc          0, 20
             3: iload_0
             4: istore_1
             5: iinc          0, 30
             8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            11: new           #3                  // class java/lang/StringBuilder
            14: dup
            15: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            18: ldc           #5                  // String 第2个输出=
            20: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            23: iload_0
            24: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            27: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            30: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            33: iload_1
            34: ireturn
            35: astore_2
            36: iinc          0, 30
            39: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            42: new           #3                  // class java/lang/StringBuilder
            45: dup
            46: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            49: ldc           #5                  // String 第2个输出=
            51: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            54: iload_0
            55: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            58: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            61: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            64: aload_2
            65: athrow
          Exception table:
             from    to  target type
                 0     5    35   any
          LineNumberTable:
            line 18: 0
            line 19: 3
            line 21: 5
            line 22: 8
            line 19: 33
            line 21: 35
            line 22: 39
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      66     0     b   I
          StackMapTable: number_of_entries = 1
            frame_type = 99 /* same_locals_1_stack_item */
              stack = [ class java/lang/Throwable ]
    
      public static void main(java.lang.String[]);
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=3, locals=2, args_size=1
             0: bipush        10
             2: istore_1
             3: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
             6: new           #3                  // class java/lang/StringBuilder
             9: dup
            10: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            13: ldc           #10                 // String 第1个输出=
            15: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            18: iload_1
            19: invokestatic  #11                 // Method test1:(I)I
            22: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            25: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            28: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            31: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            34: new           #3                  // class java/lang/StringBuilder
            37: dup
            38: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            41: ldc           #12                 // String 第3个输出=
            43: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            46: iload_1
            47: invokestatic  #13                 // Method test2:(I)I
            50: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            53: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            56: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            59: return
          LineNumberTable:
            line 27: 0
            line 28: 3
            line 29: 31
            line 30: 59
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      60     0  args   [Ljava/lang/String;
                3      57     1   num   I
    }
    SourceFile: "FinallyTest.java"

    代码:

     1 package javap;
     2 
     3 public class FinallyTestNotStatic {
     4 
     5     public int test1(int a) {
     6         try {
     7             a += 20;
     8             return a;
     9         } finally {
    10             a += 30;
    11             return a;
    12         }
    13     }
    14 
    15 
    16     public int test2(int b) {
    17         try {
    18             b += 20;
    19             return b;
    20         } finally {
    21             b += 30;
    22             System.out.println("第2个输出=" + b);  // 第2个输出
    23         }
    24     }
    25 
    26     public static void main(String[] args) {
    27 
    28         FinallyTestNotStatic finallyTestNotStatic = new FinallyTestNotStatic();
    29         int num = 10;
    30         System.out.println("第1个输出=" + finallyTestNotStatic.test1(num));  // 第1个输出
    31         System.out.println("第3个输出=" + finallyTestNotStatic.test2(num));  // 第3个输出
    32     }
    33 
    34 }
    MacBook-Pro-2$ javap -p -v FinallyTestNotStatic.class 
    Classfile /code/testDemo/src/main/java/javap/FinallyTestNotStatic.class
      Last modified 2020-11-16; size 1325 bytes
      MD5 checksum 19a63de518c165e56e581bd8dae77227
      Compiled from "FinallyTestNotStatic.java"
    public class javap.FinallyTestNotStatic
      minor version: 0
      major version: 52
      flags: ACC_PUBLIC, ACC_SUPER
    Constant pool:
       #1 = Methodref          #16.#40        // java/lang/Object."<init>":()V
       #2 = Fieldref           #41.#42        // java/lang/System.out:Ljava/io/PrintStream;
       #3 = Class              #43            // java/lang/StringBuilder
       #4 = Methodref          #3.#40         // java/lang/StringBuilder."<init>":()V
       #5 = String             #44            // 第2个输出=
       #6 = Methodref          #3.#45         // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
       #7 = Methodref          #3.#46         // java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
       #8 = Methodref          #3.#47         // java/lang/StringBuilder.toString:()Ljava/lang/String;
       #9 = Methodref          #48.#49        // java/io/PrintStream.println:(Ljava/lang/String;)V
      #10 = Class              #50            // javap/FinallyTestNotStatic
      #11 = Methodref          #10.#40        // javap/FinallyTestNotStatic."<init>":()V
      #12 = String             #51            // 第1个输出=
      #13 = Methodref          #10.#52        // javap/FinallyTestNotStatic.test1:(I)I
      #14 = String             #53            // 第3个输出=
      #15 = Methodref          #10.#54        // javap/FinallyTestNotStatic.test2:(I)I
      #16 = Class              #55            // java/lang/Object
      #17 = Utf8               <init>
      #18 = Utf8               ()V
      #19 = Utf8               Code
      #20 = Utf8               LineNumberTable
      #21 = Utf8               LocalVariableTable
      #22 = Utf8               this
      #23 = Utf8               Ljavap/FinallyTestNotStatic;
      #24 = Utf8               test1
      #25 = Utf8               (I)I
      #26 = Utf8               a
      #27 = Utf8               I
      #28 = Utf8               StackMapTable
      #29 = Class              #56            // java/lang/Throwable
      #30 = Utf8               test2
      #31 = Utf8               b
      #32 = Utf8               main
      #33 = Utf8               ([Ljava/lang/String;)V
      #34 = Utf8               args
      #35 = Utf8               [Ljava/lang/String;
      #36 = Utf8               finallyTestNotStatic
      #37 = Utf8               num
      #38 = Utf8               SourceFile
      #39 = Utf8               FinallyTestNotStatic.java
      #40 = NameAndType        #17:#18        // "<init>":()V
      #41 = Class              #57            // java/lang/System
      #42 = NameAndType        #58:#59        // out:Ljava/io/PrintStream;
      #43 = Utf8               java/lang/StringBuilder
      #44 = Utf8               第2个输出=
      #45 = NameAndType        #60:#61        // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      #46 = NameAndType        #60:#62        // append:(I)Ljava/lang/StringBuilder;
      #47 = NameAndType        #63:#64        // toString:()Ljava/lang/String;
      #48 = Class              #65            // java/io/PrintStream
      #49 = NameAndType        #66:#67        // println:(Ljava/lang/String;)V
      #50 = Utf8               javap/FinallyTestNotStatic
      #51 = Utf8               第1个输出=
      #52 = NameAndType        #24:#25        // test1:(I)I
      #53 = Utf8               第3个输出=
      #54 = NameAndType        #30:#25        // test2:(I)I
      #55 = Utf8               java/lang/Object
      #56 = Utf8               java/lang/Throwable
      #57 = Utf8               java/lang/System
      #58 = Utf8               out
      #59 = Utf8               Ljava/io/PrintStream;
      #60 = Utf8               append
      #61 = Utf8               (Ljava/lang/String;)Ljava/lang/StringBuilder;
      #62 = Utf8               (I)Ljava/lang/StringBuilder;
      #63 = Utf8               toString
      #64 = Utf8               ()Ljava/lang/String;
      #65 = Utf8               java/io/PrintStream
      #66 = Utf8               println
      #67 = Utf8               (Ljava/lang/String;)V
    {
      public javap.FinallyTestNotStatic();
        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 3: 0
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0       5     0  this   Ljavap/FinallyTestNotStatic;
    
      public int test1(int);
        descriptor: (I)I
        flags: ACC_PUBLIC
        Code:
          stack=1, locals=4, args_size=2
             0: iinc          1, 20
             3: iload_1
             4: istore_2
             5: iinc          1, 30
             8: iload_1
             9: ireturn
            10: astore_3
            11: iinc          1, 30
            14: iload_1
            15: ireturn
          Exception table:
             from    to  target type
                 0     5    10   any
          LineNumberTable:
            line 7: 0
            line 8: 3
            line 10: 5
            line 11: 8
            line 10: 10
            line 11: 14
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      16     0  this   Ljavap/FinallyTestNotStatic;
                0      16     1     a   I
          StackMapTable: number_of_entries = 1
            frame_type = 74 /* same_locals_1_stack_item */
              stack = [ class java/lang/Throwable ]
    
      public int test2(int);
        descriptor: (I)I
        flags: ACC_PUBLIC
        Code:
          stack=3, locals=4, args_size=2
             0: iinc          1, 20
             3: iload_1
             4: istore_2
             5: iinc          1, 30
             8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            11: new           #3                  // class java/lang/StringBuilder
            14: dup
            15: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            18: ldc           #5                  // String 第2个输出=
            20: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            23: iload_1
            24: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            27: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            30: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            33: iload_2
            34: ireturn
            35: astore_3
            36: iinc          1, 30
            39: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            42: new           #3                  // class java/lang/StringBuilder
            45: dup
            46: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            49: ldc           #5                  // String 第2个输出=
            51: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            54: iload_1
            55: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            58: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            61: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            64: aload_3
            65: athrow
          Exception table:
             from    to  target type
                 0     5    35   any
          LineNumberTable:
            line 18: 0
            line 19: 3
            line 21: 5
            line 22: 8
            line 19: 33
            line 21: 35
            line 22: 39
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      66     0  this   Ljavap/FinallyTestNotStatic;
                0      66     1     b   I
          StackMapTable: number_of_entries = 1
            frame_type = 99 /* same_locals_1_stack_item */
              stack = [ class java/lang/Throwable ]
    
      public static void main(java.lang.String[]);
        descriptor: ([Ljava/lang/String;)V
        flags: ACC_PUBLIC, ACC_STATIC
        Code:
          stack=4, locals=3, args_size=1
             0: new           #10                 // class javap/FinallyTestNotStatic
             3: dup
             4: invokespecial #11                 // Method "<init>":()V
             7: astore_1
             8: bipush        10
            10: istore_2
            11: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            14: new           #3                  // class java/lang/StringBuilder
            17: dup
            18: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            21: ldc           #12                 // String 第1个输出=
            23: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            26: aload_1
            27: iload_2
            28: invokevirtual #13                 // Method test1:(I)I
            31: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            34: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            37: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            40: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
            43: new           #3                  // class java/lang/StringBuilder
            46: dup
            47: invokespecial #4                  // Method java/lang/StringBuilder."<init>":()V
            50: ldc           #14                 // String 第3个输出=
            52: invokevirtual #6                  // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
            55: aload_1
            56: iload_2
            57: invokevirtual #15                 // Method test2:(I)I
            60: invokevirtual #7                  // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
            63: invokevirtual #8                  // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
            66: invokevirtual #9                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
            69: return
          LineNumberTable:
            line 28: 0
            line 29: 8
            line 30: 11
            line 31: 40
            line 32: 69
          LocalVariableTable:
            Start  Length  Slot  Name   Signature
                0      70     0  args   [Ljava/lang/String;
                8      62     1 finallyTestNotStatic   Ljavap/FinallyTestNotStatic;
               11      59     2   num   I
    }
    SourceFile: "FinallyTestNotStatic.java"

    参考文献:

    https://zhuanlan.zhihu.com/p/112244233

    https://zhuanlan.zhihu.com/p/45050364

    https://zhuanlan.zhihu.com/p/45354152

    http://zhongmingmao.me/2018/12/15/jvm-basic-native-type/

  • 相关阅读:
    01《软件工程思想》读后感01
    寒假小软件开发记录04--添加字体
    寒假小软件开发记录03--选择图片
    fiddler2 中文乱码问题
    一个很好的软件 fiddler4
    关于svn的安装问题
    ZF-关于海南的增删改需求
    (转)收集:Hibernate中常见问题 No row with the given identifier exists问题的原因及解决
    关于sqlserver还原不了数据库的原因
    OraclePLSQL Developer报“动态执行表不可访问,本会话的自动统计被禁止”的解决方案
  • 原文地址:https://www.cnblogs.com/wxdlut/p/13985169.html
Copyright © 2011-2022 走看看