Java Decompiler是一种特殊的反编译器, 它将类文件作为输入并产生Java源代码作为输出。反编译恰恰是相反的编译过程。因此, 反编译器不会生成源代码的副本。这是因为在程序编译期间源代码中丢失了一些信息。
但是有很多复杂性, 例如, Java代码是结构化的, 而字节码不是结构化的。而且, 转换不是一对一的:两个不同的Java程序可能会产生相同的字节码。
有以下可用的Java反编译器:
- DJ Java反编译器
- JReversePro
- 乔德
- JD-CORE / JD-GUI / JD Eclipse
例
让我们创建一个简单的Java程序, 将两个数字相加。
import java.util.*;
class DecompilerDemo{public static void main(String args[]){int a, b, c;
Scanner sc=new Scanner(System.in);
System.out.print("Enter the value of a: ");
a=sc.nextInt();
System.out.print("Enter the value of b: ");
b=sc.nextInt();
c=a+b;
System.out.println("sum of a and b is: "+c);
}}
请按照以下步骤将.class转换为可读的Java源代码。在这里, 我们正在使用JAD反编译器。
步骤1:从https://bit.ly/2XuRzT5下载JAD工具
步骤2:解压缩zip文件并获取jad.exe。
文章图片
步骤3:在提取zip文件的同一文件夹中创建一个.java文件(DecompilerDemo.java)。
步骤4:编译并运行.java文件。它将在相应的文件夹中生成一个.class文件。
文章图片
步骤5:现在将.class文件和jad应用程序移动到另一个文件夹。
文章图片
步骤6:输入命令:jad DecompilerDemo
文章图片
上面的命令在相应的文件夹中生成一个.jad文件。
文章图片
步骤7:键入命令:jad?s java DecompilerDemo
文章图片
它在同一文件夹中生成.java文件。
文章图片
打开DecompilerDemo.java, 我们得到以下代码:
// Decompiled by Jad v1.5.8g. Copyright 2001 Pavel Kouznetsov.// Jad home page: http://www.kpdus.com/jad.html// Decompiler options: packimports(3) // Source File Name:DecompilerDemo.javaimport java.io.PrintStream;
import java.util.Scanner;
class DecompilerDemo{DecompilerDemo(){}public static void main(String args[]){Scanner scanner = new Scanner(System.in);
System.out.print("Enter the value of a: ");
int i = scanner.nextInt();
System.out.print("Enter the value of b: ");
int j = scanner.nextInt();
int k = i + j;
System.out.println((new StringBuilder()).append("sum of a and b is: ").append(k).toString());
}}
我们可以观察到, 编写的.java文件与生成的.java文件不同, 但是输出相同。
Java类文件反汇编程序
javap命令
javap是JDK随附的Java命令行工具。它用于反汇编类文件并打印该类的可读版本。其输出取决于所使用的选项。不使用任何选项, javap将打印传递给它的类的包, 受保护的字段和公共字段以及方法。如果你没有用于创建该类的源代码, 则还可以使用javap找出可用于该类的方法。 javap命令的一般格式为:
javap [options] filename
选件
使用javap命令, 可以使用许多选项。他们之中有一些是:
- -c:打印反汇编的代码。
- -p:显示所有类和成员。
- -s:打印内部类型签名。
- -constants:显示静态最终常量。
class DisassembleDemo{public static void main(String args[]){System.out.println("Java");
}}
生成上述程序的类文件, 并使用以下命令反汇编该类文件。
javap -c -p DisassembleDemo
输出量
以下输出显示了类文件中包含的内容。
文章图片
【Java反编译器】但是, 我们无法使用javap命令获得Java源代码。因此, 有许多反编译器可以将.cl??ass文件转换为.java文件。
推荐阅读
- Java堆解析
- Java ExecutorService使用线程池
- Java EE解析
- 什么是Java()
- 如何验证Java版本
- Java绝对值abs()方法
- 如何在Java中获取字符串输入
- 如何在Java中对HashMap进行排序
- 如何在Java中对列表进行排序