我有一个我想改变的行为。我需要用另一种实现替换私有方法。通用反射技术允许修改私有变量或调用私有方法。但我发现很少有关于替换整个方法的信息。
我认为有先进的技术可以做到这一点。使用标准的java反射可能是不可能的,但可能还有其他工具可以在运行时重新编译字节代码。
答案 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;。
的东西但根据我的经验,我可以说,如果你需要这样做,你就会在某个地方出现错误。
也许你最好退一步看全貌