1

我在对象Foo中有一个闭包,在闭包内部我定义了一个名为“ myStaticMethod ”的方法,一旦在对象Foo之外调用闭包,我就想解决该方法。我也碰巧在我的对象 Foo 中有一个具有相同名称的静态方法。当我调用闭包时,我将“解决策略”设置为 DELEGATE_ONLY 以拦截对闭包中定义的myStaticMethod的调用。

我试图通过missingMethod来实现,但该方法从未被拦截。当我做 Foo. myStaticMethod非静态,方法被拦截。尽管我的解决策略设置为 DELEGATE_ONLY,但我不太明白为什么会发生这种情况。拥有Foo.myStaticMethod静态与否无关紧要,否则我错过了一些东西

class Foo {
   static myclosure = {
       myStaticMethod()
   }

   static def myStaticMethod() {}
}


class FooTest {
  def c = Foo.myclosure
  c.resolveStrategy = Closure.DELEGATE_ONLY
  c.call()

  def missingMethod(String name, def args) {
    println $name
  }
}
4

2 回答 2

5

为了解决这个问题,我最终在调用 FooTests 中的闭包之前重写了 invokeMethod

Foo.metaClass.'static'.invokeMethod = { String name, args ->
     println "Static Builder processing $name "
}

在尝试解决这个问题时,我发现了一种非常奇怪的方法来拦截丢失的静态方法。将来可能对你们中的一些人有用。

 static $static_methodMissing(String name, args) {
    println "Missing static $name"
}

-肯

于 2010-08-28T08:13:12.180 回答
3

不幸的是,闭包属性解析不会拦截静态方法。我知道拦截这些的唯一方法是覆盖拥有闭包的类上的静态 metaClass invokeMethod,例如:

class Foo {
   static myclosure = {
       myStaticMethod()
   }

    static myStaticMethod() {
       return false
   }
}

Foo.metaClass.'static'.invokeMethod = { String name, args ->
    println "in static invokeMethod for $name"
    return true
}

def closure = Foo.myclosure
assert true == closure()
于 2010-08-28T05:37:59.827 回答