简介
我正在开发一个名为awaitility的Java库,它也有一个Groovy扩展。在Java 8之前,您可以使用这样的库:
// Syntax example with the Groovy extension
await().atMost(500, MILLISECONDS).until { asynch.getValue() == 2 }
Groovy扩展使用Java API中定义的名为ConditionFactory
的类。但是这个API没有定义一个带有Groovy Closure实例的until方法。因此,该方法添加了这样的元类:
ConditionFactory.metaClass.until { Closure closure ->
delegate.until(new Callable<Boolean>() {
Boolean call() {
return closure.call();
}
});
}
正如您所看到的,它只是委托Java API中的until
方法获取Callable<Boolean>
的实例。
问题:
Java API还包含until
的重载方法,该方法以Runnable
为参数。当Groovy扩展与Java 8一起使用时,Runnable
方法的until
版本被调用,而不是until
方法,将Closure
作为参数(使用{定义的方法) {1}})。好像metaClass不再适用了。为什么会这样?有解决办法吗?
答案 0 :(得分:0)
实际上,我并不认为这与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)
}
}