我只是尝试编写这个简单的代码来测试使用metaClass的覆盖方法。
代码在这里:
class Hello {
public Hello()
{
Foo()
}
public void Foo()
{
println "old"
}
}
它有一个Foo()方法,只打印“old”,它由构造函数调用。
这是测试代码:
class HelloTest {
@Test
public void test() {
boolean methodFooWasCalled = false
Hello.metaClass.Foo = {-> println "new"
methodFooWasCalled = true
}
Hello hello = new Hello()
assertTrue methodFooWasCalled == true
}
}
我期待输出应该是“新的”,因为Foo()
已被覆盖。但它仍然印有“旧”字样。有谁知道它失败的原因?谢谢
答案 0 :(得分:4)
以下作品:
class Hello {
Hello() {
Foo()
}
}
Hello.metaClass.Foo = {->
println "new"
}
new Hello()
以下内容如下:
class Hello {
Hello() {
invokeMethod('Foo', [] as Object[])
}
void Foo() { println "old" }
}
Hello.metaClass.Foo = {->
println "new"
}
new Hello()
这个很有趣; bar()
内的Foo()
调用有效,而构造函数内的调用则不起作用:
class Hello {
Hello() {
Foo()
bar()
}
void Foo() { println "old foo"; bar() }
void bar() { println "old bar" }
}
Hello.metaClass {
Foo = {-> println "new foo" }
bar = { println "new bar" }
}
new Hello()
看起来Groovy在构造函数上没有检查元类'方法FIRST。我认为这是一个错误,我找不到任何与此相关的错误。如何填写JIRA?