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: 345
groovy
|metaprogramming
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