反编译的过程与编译刚好相反,就是将已编译好的编程语言还原到未编译的状态,也就是找出程序语言的源代码。就是将机器看得懂的语言转换成程序员可以看得懂的语言。Java语言中的反编译一般指将class文件转换成java文件。
Java常用反编译工具
本文主要介绍4个Java的反编译工具:javap、jad和cfr以及可视化反编译工具JD-GUI
JAVAP
javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。javap和其他两个反编译工具最大的区别是他生成的文件并不是java文件,也不像其他两个工具生成代码那样更容易理解。拿一段简单的代码举例,如我们想分析Java 7中的switch是如何支持String的,我们先有以下可以编译通过的源代码:public class switchDemoString {
public static void main(String[] args) {
String str = “world”;
switch (str) {
case “hello”:
System.out.println(“hello”);
break;
case “world”:
System.out.println(“world”);
break;
default:
break;
}
}
}
执行以下两个命令:javac Decompilation.java
javap -c Decompilation.class
生成代码如下:Compiled from “Decompilation.java”
public class Decompilation {
public Decompilation();
Code:
0: aload_0
1: invokespecial #8 // Method java/lang/Object.””:()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #16