1

我有一个程序,其中有一些 Java 类可用。可以反编译它们吗?是否可以在没有所有其他.class文件的情况下修改类的源代码并重新编译它?

例如,假设我有一个dog.class文件,它实现了一个动物的子类,它在animal.class.

  • 我可以dog.java不重新编译animal.class吗?
  • 我可以dog.java不重新编译animal.java吗?

我不是Java开发人员,所以如果我没有任何意义,请纠正我。

4

6 回答 6

3

您需要该class文件才能实际使用该类,但这并不意味着您需要源文件。

让我们看一下使用DogandAnimal类示例的可能性。假设Dog该类是该类的子Animal类,我们可以执行以下操作:

  • 如果你有Animal.classAnimal.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.classJava 中的源代码,我们也能够创建自己的类。

这种情况类似——只要我们有class一个类的文件,我们就可以最大限度地使用它。唯一缺少的是源代码中列出的实际实现。

于 2009-06-13T08:01:30.910 回答
1

一般来说,没有。但是,您可以为那些缺少的类制作存根(仅用于编译),然后在您拥有它们时替换原始类。

于 2009-06-13T07:48:33.610 回答
1

如果您可以访问已编译的类(示例中为animal.class),那么您可以重新编译子类(dog.java)(但是,您不需要访问超类的源代码)。

如果您甚至无法访问已编译的超类,那么如果您知道相关方法(那些从子类实现或调用的方法),那么您可以创建超类的存根来编译子类。

然而,在某些时候,您将需要一个真实版本的已编译超类来允许您的代码正确执行......

于 2009-06-13T08:00:29.493 回答
0

只是为了添加其他答案,您可能需要注意的一个方面是,如果您的类具有复杂的结构,则反编译器可能无法将其反编译为“可重新编译”状态,您可能需要手动编辑它。

于 2009-06-13T08:18:06.037 回答
0

如果您可以运行该类并对其进行反编译,那么您就拥有了编译修改后的 Java 文件所需的类(如果您将它们包含在类路径中)。

请注意,您的新类文件必须位于类路径上原始类的“前面”才能生效。

另请注意,“密封的 jarfile”不允许此技巧修改类。

于 2009-06-13T13:44:51.507 回答
0

我的 2 美分:一些反编译器会阻止物理级别的类反编译(例如,在某些反编译器的反编译过程中你会崩溃)。我遇到的反编译器的其他问题,只有少数支持注释。就我而言,当我尝试反编译一个类时,我遇到了死锁:代码包含注释,但只能通过不支持注释的反编译器进行反编译而不会崩溃。

于 2009-06-15T05:47:31.973 回答