我需要更改现有的已编译的 .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()方法。
我需要改变的第二种方法包含一些逻辑,但是我想要清除它,即使用空体的方法什么都不做。
我该怎么做?
答案 0 :(得分:4)
如果您没有所需的依赖项,那么您希望使用此代码?我强烈建议你花时间去正常编译,而不是试图只改变二进制文件。从长远来看,这可能是一个更好的选择。
答案 1 :(得分:1)
我会看看AspectJ并为每次调用ca设置触发器。然后,您可以轻松阻止该呼叫并改为呼叫。
答案 2 :(得分:1)
答案 3 :(得分:0)
我不确定你是否可以在一开始就改变它,但即使你成功了,我也不建议这样做。更简洁的解决方案是扩展您的类并覆盖ca()
方法的实现,以仅调用a()
方法。
答案 4 :(得分:0)
如果方法a
是公开的,那么最简单的方法是使用方面(Aspect Oriented Programming,AspectJ)并拦截对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/