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.me
You can use the per-instance metaClass to change the value in the existing object like so:
x= new A()
x.abc()
x.metaClass.abc={-> println "new" }
x.abc()
x.metaClass.methods.findAll{it.name=="abc"}.each { println "Method $it"}
But as you have seen, x will have two methods associated with it (well, in actual fact, a method and the closure you added
If you change the definition of A so that the method becomes a closure definition like so:
class A {
def abc = { ->
println "original"
}
}
Then you will only get a single closure in the metaClass and no method after the alteration