我有一堂课,我想更改其行为。我需要将私有方法替换为另一种实现。通用的反射技术允许修改私有变量或调用私有方法。但是我发现有关替换整个方法的信息很少。
我认为有先进的技术可以做到这一点。使用标准Java反射可能无法实现,但是可能还有其他工具可以在运行时重新编译字节码。
修改并替换:
一种选择是用修改后的副本掩盖该类(修改代码,重新编译代码,在修补类之前将修改后的类添加到类路径中),类似于此处检查通常不可用的方法如何工作的方法。
如果您没有需要修改的源代码,则可以使用反编译器将几乎所有.class文件“反向”为或多或少可读的源代码。请注意,根据许可的不同,您可能无权这样做和/或重新分发您的更改。
通过代理修补:
您也可以使用-javaagent:<jarpath>[=<options>]
命令行选项来修补方法。“代理”是一个jar,可用来修改已加载的类并更改其行为。更多信息在这里。
嘲笑:
如果你有控制其中的方法被调用,您可以用存根的版本替换目标实例。Mockito之类的库使此操作非常非常简单:
LinkedList mockedList = mock(LinkedList.class);
// stubbing appears before the actual execution
when(mockedList.get(0)).thenReturn("first");
即使Mockito不本地支持模拟私有方法(主要是因为查看其他类的私有方法被认为是不好的方式),但使用PowerMock可以这样做(谢谢@talex)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句