【问题标题】:How can I dynamically override a class's "each" method in Groovy?如何在 Groovy 中动态覆盖类的“each”方法?
【发布时间】:2011-02-14 19:00:53
【问题描述】:

Groovy adds each() 和 java.lang.Object 的许多其他方法。我不知道如何使用 Groovy 元类来动态替换 Java 类上的默认 each()。

我可以看到如何添加新方法:

MyJavaClass.metaClass.myNewMethod = { closure -> /* custom logic */ }
new MyJavaClass().myNewMethod { item -> println item }  // runs custom logic

但在覆盖方法时,似乎相同的方法不起作用:

MyJavaClass.metaClass.each = { closure -> /* custom logic */ }
new MyJavaClass().each { item -> println item }  // runs Object.each()

我做错了什么?如何在 Groovy 中动态覆盖 each()?

【问题讨论】:

    标签: groovy overriding each metaclass


    【解决方案1】:

    好吧,我在发布问题后几秒钟就找到了解决方案。我只需要在 each() 上明确指定闭包参数的类型:

    MyJavaClass.metaClass.each = { Closure closure -> /* custom logic */ }
    new MyJavaClass().each { item -> println item }  // runs custom logic
    

    通过省略类型,我添加了一个更通用的 each() 的重载版本,它接受一个 Object 参数,而不是覆盖现有的 each() 接受一个 Closure 参数。

    【讨论】:

      猜你喜欢
      • 2013-03-26
      • 2015-04-30
      • 1970-01-01
      • 2016-04-03
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多