如何在不重新编译的情况下更改.class文件中的方法

时间:2011-03-04 09:26:10

标签: java class reflection decompiling

我需要更改现有的已编译的 .class 文件。实际上我甚至有它的来源,但我不能只是改变和重新编译它,因为我没有很多依赖。

所以我需要改变2种方法。它们都有 void 返回类型。第一行只包含两行,它们是同一类的另一种方法的调用,即

public void a() {
    System.out.println("a");
}

public void b() {
    System.out.println("b");
}

public void ca() {
    a();
    b();

}

我需要更改方法 ca sp,它只调用a()方法。

我需要改变的第二种方法包含一些逻辑,但是我想要清除它,即使用空体的方法什么都不做。

我该怎么做?

9 个答案:

答案 0 :(得分:4)

如果您没有所需的依赖项,那么您希望使用此代码?我强烈建议你花时间去正常编译,而不是试图只改变二进制文件。从长远来看,这可能是一个更好的选择。

答案 1 :(得分:1)

我会看看AspectJ并为每次调用ca设置触发器。然后,您可以轻松阻止该呼叫并改为呼叫。

答案 2 :(得分:1)

在Java字节编辑器上试试这个问题。

java bytecode editor?

但是,我认为Jon Skeet的答案是真正适用的答案。

答案 3 :(得分:0)

我不确定你是否可以在一开始就改变它,但即使你成功了,我也不建议这样做。更简洁的解决方案是扩展您的类并覆盖ca()方法的实现,以仅调用a()方法。

答案 4 :(得分:0)

如果方法a是公开的,那么最简单的方法是使用方面(Aspect Oriented ProgrammingAspectJ)并拦截对ca的每次调用。而不是调用ca只需调用a

答案 5 :(得分:0)

你有没有尝试过反思?我对它的经验有限,但我不确定你想做什么。

答案 6 :(得分:0)

您可以使用Javaasist库来修改现有的类文件。

答案 7 :(得分:0)

我遇到了类似的问题。

我不得不修改没有源的类文件中的方法。 该方法严重重新抛出异常,所以我不得不调整它。 我用Classfile Analyzer(http://classfileanalyzer.javaseiten.de/)反编译了这个类 我编辑了结果文件并用Jasmine汇编程序重新编译它。

使用Apache BCEL你可以在运行时以更优雅的方式完成同样的事情,而不是像我在编译时所描述的那样。

答案 8 :(得分:0)

您可以使用java反编译器打开类文件并对其进行编辑并保存。

这是一个好的分解 - > http://java.decompiler.free.fr/