我有一个程序,其中有一些 Java 类可用。可以反编译它们吗?是否可以在没有所有其他.class
文件的情况下修改类的源代码并重新编译它?
例如,假设我有一个dog.class
文件,它实现了一个动物的子类,它在animal.class
.
- 我可以
dog.java
不重新编译animal.class
吗? - 我可以
dog.java
不重新编译animal.java
吗?
我不是Java开发人员,所以如果我没有任何意义,请纠正我。
我有一个程序,其中有一些 Java 类可用。可以反编译它们吗?是否可以在没有所有其他.class
文件的情况下修改类的源代码并重新编译它?
例如,假设我有一个dog.class
文件,它实现了一个动物的子类,它在animal.class
.
dog.java
不重新编译animal.class
吗?dog.java
不重新编译animal.java
吗?我不是Java开发人员,所以如果我没有任何意义,请纠正我。
您需要该class
文件才能实际使用该类,但这并不意味着您需要源文件。
让我们看一下使用Dog
andAnimal
类示例的可能性。假设Dog
该类是该类的子Animal
类,我们可以执行以下操作:
如果你有Animal.class
和Animal.java
,你可以Dog
上课。
如果你有Animal.class
但没有Animal.java
,你可以Dog
上课。
如果你没有Animal.class
但有Animal.java
,你可以做一个Dog
类。(这意味着Animal.java
在编译文件时需要编译该Dog.java
文件。)
如果你没有也Animal.class
没有Animal.java
,你就不能Dog
上课。
这是上述内容的表格版本:
有 Animal.java 吗?有Animal.class吗?可以做Dog类吗? ----------------- ------ ---------------- ---- 是 是 --> 是 是 否 --> 是 否 是 --> 是 否 否 --> 否
如果您拥有该class
文件,则有些程序可以反编译该class
文件以生成人类可读的java
源文件,但是,它不会恢复用于生成该class
文件的确切源。
但是,在这种情况下,如果只需要扩展Animal
类以创建新Dog
类,则不需要源代码本身。
记住这一点——每当一个类是用 Java 制作的,它总是扩展这个Object
类。即使我们无法访问Object
类的源代码,由于我们可以访问Object.class
Java 中的源代码,我们也能够创建自己的类。
这种情况类似——只要我们有class
一个类的文件,我们就可以最大限度地使用它。唯一缺少的是源代码中列出的实际实现。
一般来说,没有。但是,您可以为那些缺少的类制作存根(仅用于编译),然后在您拥有它们时替换原始类。
如果您可以访问已编译的类(示例中为animal.class),那么您可以重新编译子类(dog.java)(但是,您不需要访问超类的源代码)。
如果您甚至无法访问已编译的超类,那么如果您知道相关方法(那些从子类实现或调用的方法),那么您可以创建超类的存根来编译子类。
然而,在某些时候,您将需要一个真实版本的已编译超类来允许您的代码正确执行......
只是为了添加其他答案,您可能需要注意的一个方面是,如果您的类具有复杂的结构,则反编译器可能无法将其反编译为“可重新编译”状态,您可能需要手动编辑它。
如果您可以运行该类并对其进行反编译,那么您就拥有了编译修改后的 Java 文件所需的类(如果您将它们包含在类路径中)。
请注意,您的新类文件必须位于类路径上原始类的“前面”才能生效。
另请注意,“密封的 jarfile”不允许此技巧修改类。
我的 2 美分:一些反编译器会阻止物理级别的类反编译(例如,在某些反编译器的反编译过程中你会崩溃)。我遇到的反编译器的其他问题,只有少数支持注释。就我而言,当我尝试反编译一个类时,我遇到了死锁:代码包含注释,但只能通过不支持注释的反编译器进行反编译而不会崩溃。