替换已编译的.class文件中的方法

时间:2015-12-17 09:04:26

标签: java reflection

这里有趣的问题。所以我收到了一个.jar,它被混淆了,这意味着当我反编译.class文件时它不会显示100%完美,所以我无法重新编译它。然而,我需要改变的唯一方法已被完美转换(但课程没有))。有没有办法以某种方式更改.java代码并注入替换类文件中的方法而不完全重新编译?

如果失败则转到字节码。

谢谢!

编辑:作为后续问题/或围绕替换整个方法的黑客。我真的只是想改变方法在本地生成的变量。如果有更好的方法可以做到这一点。

3 个答案:

答案 0 :(得分:2)

根据您真正想做的事情,我不建议反编译/修改/重新编译代码(无论是出于法律,维护,可理解性和可测试性原因。)

字节码操作可能也不是最好的解决方案,但是如果你想按照这种方式查看ASM project,它就是许多已知项目使用的广泛的字节码操作框架。

如果我是你,我会首先尝试方面(AspectJ。)方面的力量是你不接触现有代码,但告诉VM在/之前/之后/之后做什么代替调用特定方法。它允许您通过以分离的方式编写自己的代码来指出确切的上下文和更改,增强代码的行为。

希望它有所帮助。

答案 1 :(得分:0)

对不起,这不是答案,但评论太长了......

  

我正在反映此代码,而不是将其用作库。所以我真的不需要“使用”这段代码(我只是在运行时反映和调用函数)。

我将“在运行时调用和调用函数”称为使用代码。

可能有这样做的原因,但我更愿意在可能的情况下简单地将该函数称为库函数(如果您可以使用反射执行相同操作,则应该可以这样做。)

  

...并手动重载它。

扩展类并覆盖“错误”方法并不简单。据我所知,即使您想“注入”该方法,您也必须将代码放在某处。你将如何测试这样的代码?扩展课程要容易得多......你能否更详细地说明你想要实现的目标,并推断为什么你不能使用我上面写的内容?

答案 2 :(得分:0)

如果您只想更改一种方法,您实际上可以extend类,然后@Override方法! 不知道这是否是完美的方式,但它有效!