Groovy метапрограммирование - добавление статических методов в Object.metaClass
Я столкнулся с проблемой метапрограммирования 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 ответа
Чтобы получить поведение, которое вы ищете, вам нужно вызвать ExpandoMetaClass.enableGlobally()
Имейте в виду, что это занимает больше места в памяти, чем обычное метапрограммирование.
http://groovy.codehaus.org/api/groovy/lang/ExpandoMetaClass.html
Я не могу заставить это работать, даже после того, как я добавил 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