如何修改或替换java类中的私有方法

时间:2015-04-27 12:21:25

标签: java reflection

我有一个我想改变的行为。我需要用另一种实现替换私有方法。通用反射技术允许修改私有变量或调用私有方法。但我发现很少有关于替换整个方法的信息。

我认为有先进的技术可以做到这一点。使用标准的java反射可能是不可能的,但可能还有其他工具可以在运行时重新编译字节代码。

3 个答案:

答案 0 :(得分:1)

修改&取代

一个选项是使用修改后的副本(修改代码,重新编译代码,在修补类之前将修改后的类添加到类路径)来掩盖类,类似于要检查的方法used here通常不可用的方法是如何工作的。

如果您没有要修改的来源,您可以"反向"使用decompilers将几乎任何.class文件转换为或多或少可读的源代码。请注意,根据许可,您可能无权这样做和/或重新分发您的更改。

通过座席补丁:

您还可以使用-javaagent:<jarpath>[=<options>] commant-line选项修补方法。 &#34;代理&#34;是一个jar,可以修改加载的类并改变它们的行为。 More information here

<强>素:

如果您可以控制调用方法的 where ,则可以使用存根版本替换目标实例。像Mockito这样的图书馆使这非常容易:

LinkedList mockedList = mock(LinkedList.class);
// stubbing appears before the actual execution
when(mockedList.get(0)).thenReturn("first");

即使Mockito本身不支持嘲弄私有方法(主要是因为看到其他类和私有方式被认为是不礼貌),使用PowerMock允许你这样做(感谢@talex)。

答案 1 :(得分:0)

不是采用高级技术,而是有一个简单的技巧来实现这一目标。

如果您的类是开源jar的一部分,请从grepcode.com获取此类文件的源代码。更改要更改的方法并进行编译。并使用此更新的类文件更新您的jar文件/类路径。

答案 2 :(得分:0)

您无法在运行时替换方法(至少不会破解JVM)。但是你可以取代全班。有几种方法可以做到这一点。例如,你可以使用名为&#34; aspect&#34;。

的东西

但根据我的经验,我可以说,如果你需要这样做,你就会在某个地方出现错误。

也许你最好退一步看全貌