简介:
我正在开发一个名为 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/