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

标签 groovy metaprogramming

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

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

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

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

最佳答案

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 - 如何在元类中使用该方法更改 groovy 中方法的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/920582/

相关文章:

java - Groovy:java.lang.ClassNotFoundException

java - 解析未知的 XML 派生文件

c++ - 使用 TMP 预计算值何时真正有用?

groovy - 为什么仅在不需要返回值时才在 Groovy 中使用括号是可选的?

testing - 使用 groovy 使 soapUI 测试用例失败但不中止

java - grails 中的 log4j : how to log into file?

c++ - 如何反转整数参数包?

Ruby:在模块中动态定义类方法

ruby - "target.should be"如何在rspec中工作

grails - Grails-全局通用的制作方法和元类编程