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/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏