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/

原文地址:https://www.cnblogs.com/wxdlut/p/13985169.html