javap实例分析

一.基本命令及原始代码

  本文分析使用的源代码如下:

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 }

猜你喜欢

转载自www.cnblogs.com/Sydney/p/9692251.html