Groovy方法弥补

ken*_*ken 1 groovy mop

我在对象Foo中有一个闭包,在闭包内部我定义了一个名为' myStaticMethod ' 的方法,一旦在对象Foo外部调用闭包,我想解决它.我也碰巧在我的对象Foo中使用相同名称的"有目的"静态方法.当我调用闭包时,我将'resolve strategy'设置为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
  }
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ken 5

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

Foo.metaClass.'static'.invokeMethod = { String name, args ->
     println "Static Builder processing $name "
}
Run Code Online (Sandbox Code Playgroud)

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

 static $static_methodMissing(String name, args) {
    println "Missing static $name"
}
Run Code Online (Sandbox Code Playgroud)

-Ken