Следующий код попытался заменить существующий метод в классе 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 [email protected][name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
Означает ли это, что, изменяя метакласс, устанавливая его на закрытие, он на самом деле не заменяет его, а просто добавляет другой метод, который он может вызвать, что приводит к метаклассу, имеющему два метода? Можно ли по-настоящему заменить метод, чтобы вторая строка выводила "новый"?
Когда вы пытаетесь понять это, я обнаружил, что DelegatingMetaClass может помочь - это самый способ Groovy сделать это?