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

时间:2009-09-22 22:21:49

标签: grails groovy metaprogramming

我遇到了一个我无法解决的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吗?

2 个答案:

答案 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