El siguiente código trataron de sustituir un método existente en una clase maravillosa:¿Es posible reemplazar el método Groovy por un objeto existente?
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()
Y el resultado es el siguiente resultado:
original
original
Method [email protected][name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
¿Quiere decir esto que cuando modifique la metaclase estableciéndolo en cierre, realmente no lo reemplaza, sino que simplemente agrega otro método que puede llamar, lo que resulta en metaclass que tiene dos métodos? ¿Es posible reemplazar realmente el método para que la segunda línea de salida imprima "nuevo"?
Al tratar de resolverlo, encontré que DelegatingMetaClass podría ayudar - ¿es esa la manera más maravillosa de hacer esto?
Gracias - Estoy tratando de usar esto para anular un método en la clase existente de Groovy, así que estoy tratando de evitar modificar la clase original. –