Следующий код пытался заменить существующий метод в классе Groovy:
class A {
void abc() {
println "original"
}
}
x= new A()
x.abc()
A.metaClass.abc={-> println "new" }
x.abc()
A.metaClass.methods.findAll{it.name=="abc"}.each { println "Method $it"}
new A().abc()
И это приводит к следующему выводу:
original
original
Method org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod@103074e[name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
Означает ли это, что при изменении метакласса путем установки его на закрытие, он на самом деле не заменяет его, а просто добавляет другой метод, который может вызвать, в результате чего метакласс имеет два метода? Можно ли по-настоящему заменить метод, чтобы вторая строка вывода выводила «new»?
При попытке понять это, я обнаружил, что DelegatingMetaClass может помочь - это самый Groovy способ сделать это?