2015-12-17 29 views
5

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

如果这个失败即时转到字节码。

谢谢!

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

+1

如果您的代码是该库的使用者,那么可以在代码中扩展该类,然后覆盖所需的方法? – Manish

+1

可能的重复:http:// stackoverflow。com/questions/5191888 /如何改变方法在类文件中不需要重新编译 –

+0

我想我忘了提到的一件事是我反映了这个代码,并没有将它用作库。所以我真的不需要“使用”这个代码。我只想在文件中替换这个方法,以便我不必反映类中的所有字段并手动将它重载。 – k9b

回答

2

取决于你真正想做的事,我不推荐反编译/修改/重新编译代码(无论是法律,修的,可理解性,可测性的原因。)

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

如果我是你,我会先尝试一些方面(AspectJ)。方面的力量是你不会触摸现有的代码,但告诉虚拟机在/之前/之后/取代调用一个特定的方法。它允许您指出确切的上下文并进行更改,通过以分离方式编写自己的代码来增强代码的行为。

希望它有帮助。

0

对不起,这不是一个答案,但它是一个评论太长......

我反映这一代码,而不是使用它作为一个库。所以我真的不需要“使用”这个代码(也就是我只是在运行时反射和调用函数)。

我会使用代码调用“运行时反射和调用函数”。

可能有这样做的原因,但如果可能的话,我宁愿简单地调用函数作为库函数(如果可以使用反射来做同样的事情,这应该是可能的)。

...并手动超载它。

没有什么比这更简单的扩展类并覆盖“错误”的方法。就我的理解而言,即使你想“注入”这个方法,你也必须有代码。你将如何测试这样的代码?只是扩展课程会容易得多...你能否更详细地指定你想要达到的理由,以及为什么你不能使用我上面写的内容?

0

如果你想改变只是一种方法,你可以实际上extend类,然后@Override的方法! 不知道这是否是完美的方式,但它的工作原理!

相关问题