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

如何在元类中使用该方法更改groovy中方法的行为,groovy,metaprogramming,Groovy,Metaprogramming,我希望通过以下方式在Groovy中“破坏”plus方法: Integer.metaClass.plus {Integer n -> delegate + n + 1} assert 2+2 == 5 我得到了StackOverflowException(这并不奇怪) 有没有办法在元类的闭包中使用“原始”plus方法?使用此方法来“破坏”plus方法: Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)} asser

我希望通过以下方式在Groovy中“破坏”plus方法:

Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
我得到了StackOverflowException(这并不奇怪)

有没有办法在元类的闭包中使用“原始”plus方法?

使用此方法来“破坏”plus方法:

Integer.metaClass.plus {Integer n -> delegate - (-n) - (-1)}
assert 2+2 == 5
毫不奇怪,在重载plus方法中使用“+”运算符将导致堆栈溢出,需要使用“+”运算符以外的其他运算符

其他机制:使用XOR或一些位运算符魔术

问候,,
PeaceFire

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

这实际上并没有很好的文档记录,我计划今晚或明天就这个主题发表一篇博文:)。

Groovy 1.6似乎足够聪明,可以将call delegate-(-n)更改为delegate+n,StackOverflowException仍然存在。。我的版本是Groovy 1.6和Java 1.5.015,我在Groovy控制台中运行了它,它运行得很好,没有抛出任何StackOverflowException,我在groovyshell中运行,它运行得很好。你是如何在脚本上面运行的?刚才看到了Ted在上面发布的答案。我认为这是更好的一般解决办法+1到Ted。