【发布时间】:2011-01-27 13:03:54
【问题描述】:
以下代码尝试替换 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 org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod@103074e[name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
这是否意味着当通过将元类设置为闭包来修改元类时,它并没有真正替换它,而只是添加了另一个它可以调用的方法,从而导致元类有两个方法?是否可以真正替换该方法,以便第二行输出打印“新”?
当我试图弄清楚时,我发现DelegatingMetaClass 可能会有所帮助——这是最时髦的方法吗?
【问题讨论】: