我在一个物体内关闭 foo 在封闭式内部,我定义了一种称为'的方法神秘术``一旦闭合被称为在物体之外,我想解决 foo. 。我也碰巧在我的对象foo中具有相同名称的静态方法。当我调用关闭时,我将“解决策略”设置为delegate_only以拦截呼叫 神秘术 这是在关闭中定义的。

我试图通过 失踪 但是该方法永远不会被拦截。当我做foo时。神秘术 非静态,该方法被拦截。我不太明白为什么我的决心策略设定为授权。有 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
  }
}
有帮助吗?

解决方案

不幸的是,静态方法并未被关闭属性分辨率拦截。我知道拦截这些的唯一方法是覆盖拥有关闭的班级中的静态元元素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()

其他提示

为了解决这个问题,我最终在呼叫脚步之前就覆盖了InvokeMethod

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

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

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

-ken

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top