我遇到了一个我无法解决的Groovy元编程问题。
将静态方法foo()添加到类FooBar时,FooBar.foo()按预期工作:
FooBar.metaClass.static.foo = {
println "hello"
}
FooBar.foo()
但是,我将相同的静态方法foo()添加到Object类中,然后FooBar.foo()失败并出现MissingMethodException:
Object.metaClass.static.foo = {
println "hello"
}
FooBar.foo()
// groovy.lang.MissingMethodException:
// No signature of method: FooBar.foo() is applicable for argument types:
// () values: []
为什么?不应该Object.metaClass.static.foo = { .. }
将foo()添加到FooBar吗?
答案 0 :(得分:11)
为了获得您正在寻找的行为,您需要调用ExpandoMetaClass.enableGlobally()
请记住,这比正常的元编程具有更大的内存占用。
http://groovy.codehaus.org/api/groovy/lang/ExpandoMetaClass.html#enableGlobally()
答案 1 :(得分:0)
即使我在脚本开头添加了ExpandoMetaClass.enableGlobally()之后,我似乎也无法工作:
ExpandoMetaClass.enableGlobally();
Object.metaClass.static.Log = { msg ->
println(msg);
}
class Foo {
def l() {
Log("Foo:l().log"); // works
}
}
Object.Log("Object.log"); // works
String.Log("String.log"); // works
Log("script.log"); // works
foo = new Foo();
foo.l();
foo.Log("foo.log"); // works
Foo.Log("Foo.log") // Does not work