2009-05-28 28 views
5

這種方法,我想通過以下方式來「糟蹋」加成法在Groovy Groovy中的基法行爲:如何更改使用元類

Integer.metaClass.plus {Integer n -> delegate + n + 1} 
assert 2+2 == 5 

我得到StackOverflowException(這並不奇怪) 。

有沒有什麼方法在metaclass'closure內部使用「original」加法?

回答

7

Groovy的慣用的方法是保存老方法的引用,並調用它的一個新的內部。

def oldPlus = Integer.metaClass.getMetaMethod("plus", [Integer] as Class[]) 

Integer.metaClass.plus = { Integer n -> 
    return oldPlus.invoke(oldPlus.invoke(delegate, n), 1)   
} 

assert 5 == 2 + 2 

這實際上並沒有很好的記錄,我打算在今晚或明天發佈關於這個確切主題的博客文章:)。

1

使用此爲「破壞」加成法:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)} 
assert 2+2 == 5 

毫不奇怪,用「+」運算符重載以及方法將導致在StackOverflow上,則需要使用其他的東西,然後「+」操作符。

其他機制:使用XOR或一些位運算符魔術。

問候, Peacefulfire

+0

似乎Groovy 1.6足夠聰明,可以將調用委託 - (-n)更改爲委託+ n,而StackOverflowException仍然拋出 – 2009-05-29 12:07:40