Groovy метапрограммирование - добавление статических методов в Object.metaClass - PullRequest
8 голосов
/ 23 сентября 2009

Я столкнулся с проблемой метапрограммирования 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 ]

11 голосов
/ 23 сентября 2009

Чтобы получить нужное вам поведение, вам нужно вызвать ExpandoMetaClass.enableGlobally ()

Имейте в виду, что это занимает больше места в памяти, чем обычное метапрограммирование.

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

0 голосов
/ 25 августа 2015

Я не могу заставить это работать, даже после того, как я добавил 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
...