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

Pio*_*ski 5 groovy metaprogramming

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

Integer.metaClass.plus {Integer n -> delegate + n + 1}
assert 2+2 == 5
Run Code Online (Sandbox Code Playgroud)

我得到StackOverflowException(这并不奇怪).

有没有办法在元类'闭包中使用"原始"加法?

Ted*_*eid 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
Run Code Online (Sandbox Code Playgroud)

这实际上并没有详细记录,我计划在今晚或明天发布关于这个确切主题的博客文章:).