如何在元类中使用该方法更改groovy中方法的行为

时间:2009-05-28 12:24:37

标签: groovy metaprogramming

我想通过以下方式“破坏”Groovy中的方法:

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

我收到了StackOverflowException(这并不奇怪)。

有没有办法在元类'闭包中使用“original”plus方法?

2 个答案:

答案 0 :(得分: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 :(得分:1)

用它来“破坏”加法:

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

毫不奇怪,在重载加方法中使用'+'运算符会导致StackOverflow,需要使用“+”运算符以外的其他东西。

其他机制:使用XOR或某些位操作符魔法。

此致 Peacefulfire