下面的代碼試圖在Groovy類,以取代現有的方法:是否有可能取代現有對象的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 [email protected][name: abc params: [] returns: class java.lang.Object owner: class A]
Method public void A.abc()
new
這是否意味着,當將其設置爲修改元類閉包,它並不真正代替它,但只是增加了另一種可以調用的方法,從而導致元類有兩種方法?是否有可能真正取代該方法,以便第二行輸出打印「新」?
當試圖找出它的時候,我發現DelegatingMetaClass可能會有幫助 - 是最Groovy的方式嗎?
謝謝 - 我想用它來覆蓋現有的Groovy類中的方法,所以我試圖避免修改原始類。 – 2010-03-15 14:46:09