一.基本命令及原始代码
本文分析使用的源代码如下:
1 public class StringTest{ 2 public static void main(String[] args){ 3 String a = "a" + "b" + 1; 4 String b = "ab1"; 5 System.out.println(a == b); 6 } 7 }
使用javap命令进行反编译:
1 javac -g:vars,lines StringTest.java 2 3 javap -verbose StringTest
反编译的结果如下:
1 public class StringTest 2 minor version: 0 3 major version: 52 4 flags: ACC_PUBLIC, ACC_SUPER 5 Constant pool: 6 #1 = Methodref #6.#25 // java/lang/Object."<init>":()V 7 #2 = String #26 // ab1 8 #3 = Fieldref #27.#28 // java/lang/System.out:Ljava/io/PrintStream; 9 #4 = Methodref #29.#30 // java/io/PrintStream.println:(Z)V 10 #5 = Class #31 // StringTest 11 #6 = Class #32 // java/lang/Object 12 #7 = Utf8 <init> 13 #8 = Utf8 ()V 14 #9 = Utf8 Code 15 #10 = Utf8 LineNumberTable 16 #11 = Utf8 LocalVariableTable 17 #12 = Utf8 this 18 #13 = Utf8 LStringTest; 19 #14 = Utf8 main 20 #15 = Utf8 ([Ljava/lang/String;)V 21 #16 = Utf8 args 22 #17 = Utf8 [Ljava/lang/String; 23 #18 = Utf8 a 24 #19 = Utf8 Ljava/lang/String; 25 #20 = Utf8 b 26 #21 = Utf8 StackMapTable 27 #22 = Class #17 // "[Ljava/lang/String;" 28 #23 = Class #33 // java/lang/String 29 #24 = Class #34 // java/io/PrintStream 30 #25 = NameAndType #7:#8 // "<init>":()V 31 #26 = Utf8 ab1 32 #27 = Class #35 // java/lang/System 33 #28 = NameAndType #36:#37 // out:Ljava/io/PrintStream; 34 #29 = Class #34 // java/io/PrintStream 35 #30 = NameAndType #38:#39 // println:(Z)V 36 #31 = Utf8 StringTest 37 #32 = Utf8 java/lang/Object 38 #33 = Utf8 java/lang/String 39 #34 = Utf8 java/io/PrintStream 40 #35 = Utf8 java/lang/System 41 #36 = Utf8 out 42 #37 = Utf8 Ljava/io/PrintStream; 43 #38 = Utf8 println 44 #39 = Utf8 (Z)V 45 { 46 public StringTest(); 47 descriptor: ()V 48 flags: ACC_PUBLIC 49 Code: 50 stack=1, locals=1, args_size=1 51 0: aload_0 52 1: invokespecial #1 // Method java/lang/Object."<init>":()V 53 4: return 54 LineNumberTable: 55 line 1: 0 56 LocalVariableTable: 57 Start Length Slot Name Signature 58 0 5 0 this LStringTest; 59 60 public static void main(java.lang.String[]); 61 descriptor: ([Ljava/lang/String;)V 62 flags: ACC_PUBLIC, ACC_STATIC 63 Code: 64 stack=3, locals=3, args_size=1 65 0: ldc #2 // String ab1 66 2: astore_1 67 3: ldc #2 // String ab1 68 5: astore_2 69 6: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 70 9: aload_1 71 10: aload_2 72 11: if_acmpne 18 73 14: iconst_1 74 15: goto 19 75 18: iconst_0 76 19: invokevirtual #4 // Method java/io/PrintStream.println:(Z)V 77 22: return 78 LineNumberTable: 79 line 3: 0 80 line 4: 3 81 line 5: 6 82 line 6: 22 83 LocalVariableTable: 84 Start Length Slot Name Signature 85 0 23 0 args [Ljava/lang/String; 86 3 20 1 a Ljava/lang/String; 87 6 17 2 b Ljava/lang/String; 88 StackMapTable: number_of_entries = 2 89 frame_type = 255 /* full_frame */ 90 offset_delta = 18 91 locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String ] 92 stack = [ class java/io/PrintStream ] 93 frame_type = 255 /* full_frame */ 94 offset_delta = 0 95 locals = [ class "[Ljava/lang/String;", class java/lang/String, class java/lang/String ] 96 stack = [ class java/io/PrintStream, int ] 97 }