Java Decompiler是一种特殊的反编译器, 它将类文件作为输入并产生Java源代码作为输出。反编译恰恰是相反的编译过程。因此, 反编译器不会生成源代码的副本。这是因为在程序编译期间源代码中丢失了一些信息。
但是有很多复杂性, 例如, Java代码是结构化的, 而字节码不是结构化的。而且, 转换不是一对一的:两个不同的Java程序可能会产生相同的字节码。
有以下可用的Java反编译器:
- DJ Java反编译器
- JReversePro
- 乔德
- JD-CORE / JD-GUI / JD Eclipse
JAD反编译器
JAD是一个命令行应用程序。它是用C ++编写的。主要功能是反汇编.class文件。可以从控制台部署JAD, 它将Java类反编译为源代码。这样, 开发人员可以深入研究Java运行时库的代码, 甚至美化行, 为重新编译做准备。存在覆盖源代码文件的风险, 尤其是在使用’-o’(覆盖未经确认的输出文件)参数时, 尤其如此。
例
让我们创建一个简单的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.java
import 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:显示静态最终常量。
使用javap命令反汇编类文件
class DisassembleDemo
{
public static void main(String args[])
{
System.out.println("Java");
}
}
生成上述程序的类文件, 并使用以下命令反汇编该类文件。
javap -c -p DisassembleDemo
输出量
以下输出显示了类文件中包含的内容。
但是, 我们无法使用javap命令获得Java源代码。因此, 有许多反编译器可以将.class文件转换为.java文件。
评论前必须登录!
注册