我正在尝试重新定义类的方法以用于测试目的 .

为此,我使用了Groovy的元编程功能 .

不幸的是,这种方法是通过我自己控制的一些代码进行内省调用的 .

在这种情况下,调用真实方法而不是被覆盖的版本 .

这是一个groovy脚本示例,演示了这一点:

class Dummy { void sayHello() {println "Hi"} }

def dummy = new Dummy()
dummy.sayHello()

dummy.metaClass.sayHello = {println "Hello world"}
dummy.sayHello()

def method = dummy.class.getDeclaredMethod("sayHello")
method.invoke(dummy)

此代码输出为:

嗨你好世界嗨

但我希望最后一行成为'Hello World'

我试图覆盖Method.invoke方法,但它是一团糟 .

是否有一种首选的方法告诉Groovy,当检测到对Dummy#sayHello的调用时,它还应该拦截对Method.invoke的调用?