Groovy元编程 - 向Object.metaClass添加静态方法

kno*_*orv 8 grails groovy metaprogramming

我遇到了一个我无法解决的Groovy元编程问题.

将静态方法foo()添加到类FooBar时,FooBar.foo()按预期工作:

FooBar.metaClass.static.foo = {
    println "hello"
}
FooBar.foo()
Run Code Online (Sandbox Code Playgroud)

但是,我将相同的静态方法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: []
Run Code Online (Sandbox Code Playgroud)

这是为什么?不应该Object.metaClass.static.foo = { .. }将foo()添加到FooBar中吗?

小智 11

为了获得您正在寻找的行为,您需要调用ExpandoMetaClass.enableGlobally()

请记住,这比正常的元编程具有更大的内存占用.

http://groovy.codehaus.org/api/groovy/lang/ExpandoMetaClass.html#enableGlobally()