反编译Java类
在本篇文章中,我们将了解反编译 Java .class 文件的技巧。 我们将了解反编译的简要概述、如何在 Java 中反编译 .class 文件,以及在 Java 中反编译文件时可能会看到哪些变化。
反编译 Java 类的原因
在 Java 开发人员的职业生涯中,他们至少遇到过一次必须面对 JAR 文件或必须将 .class 文件反编译回源代码的情况。
众所周知,JAR 文件是一个 Java 存档包,其中包含不同 Java 类文件和其他资源(例如图像、音频等)的集合。这些文件以 ZIP 格式构建,并使用扩展名 .jar。
JAR 文件的问题是用户没有被授予打开该文件的权限。 访问这些文件的唯一方法是用户反编译 JAR 文件。
为了能够读取该文件中的.class文件,我们必须使用软件工具来反编译该文件。
另一方面,通过.class文件,我们可以使用Eclipse IDE和IntelliJ IDEA等软件。 此外,命令行参数可用于反编译 .class 文件。
Java反编译器
反编译属于逆向工程,因为我们将 JAR 文件反编译为可读的类文件。 我们将在本指南的后面部分了解这一点,但首先让我们研究一下 .class 文件。
有多种方法可以反编译 .class 文件。 这取决于什么最适合用户使用这些文件。
有一些软件工具可以帮助完成此过程,但我们还可以通过其他方法将 .class 文件反编译为源代码。 我们使用的两种方法是 Eclipse IDE 和 IntelliJ IDEA 等软件。
使用这两个的最重要的优点是反编译器非常易于使用。 让我们看看最常用的软件——Eclipse IDE。
为此,您需要遵循一些步骤。
使用 Eclipse IDE 反编译 Java 类
一个插件用于反编译.class文件; 在这个软件中,该插件被称为增强类反编译器(ECD)。 增强类反编译器可以从软件市场(称为 Eclipse Marketplace)轻松安装。
- 为此,我们将转到“转到帮助”选项并选择 Eclipse Marketplace。
- 之后,搜索增强类反编译器。 之后,我们需要设置 ECD 才能正常工作。
- 要设置 ECD,我们单击菜单中的“转到窗口”选项,然后单击“首选项”。
- 然后选择常规,您将在下拉列表中找到编辑器选项。
- 单击上一个选项后,在另一个下拉列表中选择文件关联。
-
最后,选择
*.class without source
选项。
现在只需单击 .class 文件即可对其进行反编译。
使用 IntelliJ IDEA 反编译 Java 类
使用该软件的主要原因是我们不需要下载或设置反编译器。 该软件具有默认的反编译器,使用户可以更轻松地使用IntelliJ IDEA。
我们所要做的就是在 IntelliJ IDEA 中打开一个 .class 文件,它会自动反编译该文件。
使用命令行反编译Java类
反编译 .class 文件的另一种方法是使用命令行。 此方法具有三个选项。 这完全取决于用户的选择。
使用JD-CLI
JD-CLI 用于单个命令行语句。 反编译类文件只需要一个命令。
这是用于反编译类文件的命令:
java -jar jd-cli.jar [class-file]
我们可以通过点击这里下载这个反编译器:intoolswetrust/jd-cli:命令行Java反编译器(github.com)。
使用 FernFlower
FernFlower 是下载到系统的另一个反编译器,用于反编译 .class 文件。
我们必须克隆这个反编译器才能使用 FernFlower。 我们通过单击此处来完成此操作:fesh0r/fernflower:FernFlower Java 反编译器的非官方镜像 (github.com)。
这些是用于克隆的命令:
git clone https://github.com/fesh0r/fernflower
cd fernflower
gradle build
要反编译文件,请使用此命令。
java -jar fernflower.jar [path to JAR or .class file] [directory to store the decompiled files]
使用 JD-GUI 反编译 Java 类
反编译 JAR 文件与反编译 .class 文件不同。 Java反编译器是最常用的反编译JAR文件的软件工具。
该工具可以轻松下载。 用户可以根据需要点击这里下载该软件的不同版本。
在这些版本中,JD-GUI是最知名的Java反编译器的UI版本。 JD-GUI 是一个应用程序,允许用户查看 JAR 文件中的隐藏类文件。
请注意,低级信息(例如 .class 文件中的注释)将会消失。 一些原始变量名称也有可能消失,但这取决于用户在编译时选择的选项。
如果在编译时使用了调试器,请放心,.class 文件将采用更好的可读形式,因为我们不会获得相同的源代码。
让我们借助一个使用注释的简单 Hello World 示例更好地理解这个概念。
class Example1
{
public static void main(String[] args)
{
//This is the comment used.
System.out.println("Hello World");
}
}
当我们反编译这个 JAR 文件形式的 HelloWorld 文件时,我们将得到这个 .class 文件作为输出。
输出:
class Example1
{
public static void main(String[] paramArrayOfString){System.out.println("Hello World");}
}
正如您所看到的,这两个文件之间的明显区别是注释消失了,并且 main 方法的参数发生了明显的变化。
最后,这取决于用户使用什么软件工具来反编译 Java JAR 文件,因为有很多选择。
相关文章
Java 错误 Java.Security.InvalidKeyException: Illegal Key Size
发布时间:2023/07/15 浏览次数:98 分类:Java
-
本篇文章介绍包含 java.security.InvalidKeyException: Illegal key size 的 Java 代码。 然后,我们将了解其可能的原因。最后,它通过消除指定的错误来引导我们找到解决方案。
Java 错误 Java.SQL.SQLException: Access Denied for User Root@Localhost
发布时间:2023/07/15 浏览次数:71 分类:Java
-
本篇文章介绍如何解决 Java 中的 java.sql.SQLException: Access Denied for user 'root'@'localhost' 错误。修复 Java 中的 java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
Java 异常 Java.Lang.ClassNotFoundeException: Sun.Jdbc.Odbc.JdbcOdbcDriver
发布时间:2023/07/15 浏览次数:105 分类:Java
-
本篇文章介绍了 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver 错误。修复 Java 中的 java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
Java 错误 Gateway Process Exited Before Sending Its Port Number
发布时间:2023/07/15 浏览次数:104 分类:Java
-
本篇文章介绍了 Java 中 Java gateway process exited before sending the driver its port number 错误 Java gateway process exited before sending the driver its port number 错误
修复 Java 中 Java.Net.BindException: Address Already in Use: Bind 错误
发布时间:2023/07/15 浏览次数:76 分类:Java
-
本篇文章介绍了 Java 中的 java.net.BindException:Address already in use: Bind 错误。修复Java 中的 java.net.BindException:Address already in use: Bind
修复 Java 中 Java.Net.SocketException: Broken Pipe 错误
发布时间:2023/07/15 浏览次数:162 分类:Java
-
本篇文章介绍了使用 Java 编程的 java.net.SocketException: Broken pipeline 错误,并重点介绍了其可能的原因和解决方案。错误描述、原因及解决方法
Java 异常 Java.Lang.ClassNotFoundException: Org.SpringFramework.Web.Servlet.Dis
发布时间:2023/07/15 浏览次数:179 分类:Java
-
今天关于 Java 的文章将介绍错误 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet。什么是 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet
Java 抛出运行时异常 Throw Runtime Exception
发布时间:2023/07/15 浏览次数:146 分类:Java
-
本篇文章介绍如何在 Java 中引发运行时异常。Java 抛出运行时异常 Runtime Exception 是所有 Java 异常的父类,这些异常发生时会导致程序崩溃或崩溃。
Java 中抛出新异常 Throw New Exception
发布时间:2023/07/15 浏览次数:130 分类:Java
-
本文将展示如何使用 if ... else 条件语句生成错误。 我们还将使用示例和解释来讨论该主题,以使该主题更容易。在 Java 中生成一个简单错误