如何理解 Java的反编译

理解反编译前,先要知道编译,编译指把高级语言(Java)翻译成计算机可识别的二进制语言。那么反编译就是对程序的逆向分析

让我们一起动手试试吧,反编译下面的代码:

1
2
3
4
5
6
7
8
public class Hello {
public static void main(String[] args) {
int i = 1;
i = i++; // i = 1
int j = i++; // i = 2, j = 1
int k = i + ++i * i++; // i = 4, k = 2 + (3 * 3)
}
}
  1. 输入编译指令
1
javac Hello.java
  1. 反编译指令
1
javap -c Hello.class > Hello.txt
  • -c:指定文件名
  • >:把反编译的内容输出
  1. 得到内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Code:
// int i = 1;
0: iconst_1 // 1 -> 栈顶
1: istore_1 // 栈顶 -> 局部变量(索引为1)

// i = i++;
2: iload_1 // 局部变量(1) -> 栈顶
3: iinc 1, 1 // 局部变量(1) + 1
6: istore_1 // 栈顶 -> 局部变量(1) [i = 1]

// int j = i++;
7: iload_1 // 同上
8: iinc 1, 1 // 同上 [i = 2]
11: istore_2 // 栈顶 -> 局部变量(2) [j = 1]

// int k = i + ++i * i++;
12: iload_1 // 所有的i [i = 2]
13: iinc 1, 1 // ++i [i = 3]
16: iload_1 // 第二个i [i = 3]
17: iload_1 // 第三个i [i = 3]
18: iinc 1, 1 // i++ [i = 4]
21: imul // 3 * 3
22: iadd // 2 + 9
23: istore_3 // 栈顶 -> 局部变量(3) [k = 11]
24: return

------------------------- 结果 --------------------------
i = 4, j = 1, k = 11

评论