java - Groovy 元类与 Java 8 的互操作性

标签 java groovy java-8 metaclass

简介:

我正在开发一个名为 awaitility 的 Java 库它也有一个 Groovy 扩展。在 Java 8 之前,您可以像这样使用该库:

// Syntax example with the Groovy extension
await().atMost(500, MILLISECONDS).until { asynch.getValue() == 2 }

Groovy 扩展使用了一个名为 ConditionFactory 的类在 Java API 中定义。但是这个 API 没有定义采用 Groovy Closure 实例的 until 方法。因此,该方法添加了一个元类,如下所示:

ConditionFactory.metaClass.until { Closure closure ->
      delegate.until(new Callable<Boolean>() {
        Boolean call() {
          return closure.call();
        }
      });
    }

如您所见,它只是委托(delegate)给 until采用 Callable<Boolean> 实例的 Java API 中的方法.

问题:

Java API 还包含一个重载方法 until这需要 Runnable作为它的参数。当 Groovy 扩展与 Java 8 一起使用时 Runnable until 的版本方法被调用而不是 until取法Closure作为参数(使用 metaClass 定义的方法)。似乎元类不再起作用。这是为什么?有解决方法吗?

最佳答案

实际上我不认为这与 Java 8 有任何关系(抱歉造成混淆)。我的问题的解决方法如下所示:

def originalMethod = ConditionFactory.metaClass.getMetaMethod("until", Runnable.class)
ConditionFactory.metaClass.until { Runnable runnable ->
  if (runnable instanceof Closure) {
    delegate.until(new Callable<Boolean>() {
      Boolean call() {
        return (runnable as Closure).call();
      }
    });
  } else {
    originalMethod.invoke(delegate, runnable)
  }
}

关于java - Groovy 元类与 Java 8 的互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22754660/

相关文章:

spring - 在 Oracle Timestamp 列中以 UTC 格式保存日期

java - getPreferenceScreen().findPreference 与 findPreference 之间的区别

java - JOptionPane.showMessageDialog - 为什么要分解复选框?

java - Groovy 无法解析 Java 类

Java收集列表但指定预定义的前两个元素顺序

java - 将 List<T> 中的平均值作为单个 T 对象返回

java - 我如何在java中对用户输入进行单元测试

java - Google Guice 绑定(bind)不适用于 Integer 和 Long

groovy - Gradle任务对动态创建任务的依赖

Groovy 作为列表问题