Groovy元类与Java 8的互操作性

时间:2014-03-31 06:09:51

标签: 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扩展使用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不再适用了。为什么会这样?有解决办法吗?

1 个答案:

答案 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)
  }
}