Is it possible to replace groovy method for existing object?

Posted by Jean Barmash on Stack Overflow See other posts from Stack Overflow or by Jean Barmash
Published on 2010-03-15T03:21:46Z Indexed on 2010/03/15 3:29 UTC
Read the original article Hit count: 311

Filed under:
|

The following code tried to replace an existing method in a Groovy class:

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()

And it results in the following output:

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

Does this mean that when modify the metaclass by setting it to closure, it doesn't really replace it but just adds another method it can call, thus resulting in metaclass having two methods? Is it possible to truly replace the method so the second line of output prints "new"?

When trying to figure it out, I found that DelegatingMetaClass might help - is that the most Groovy way to do this?

© Stack Overflow or respective owner

Related posts about groovy

Related posts about metaprogramming