1

オブジェクトFoo内にクロージャーがあり、クロージャー内に「 myStaticMethod 」というメソッドを定義します。これは、オブジェクトFooの外側でクロージャーが呼び出されたときに解決したいものです。また、オブジェクト Foo 内に同じ名前の静的メソッドを「意図的に」持っていることもあります。クロージャーを呼び出すとき、「解決戦略」を DELEGATE_ONLY に設定して、クロージャー内で定義されているmyStaticMethodへの呼び出しをインターセプトします。

私はmissingMethodでそれを達成しようとしましたが、メソッドが傍受されることはありません。私がフーを作るとき。myStaticMethod非静的。メソッドはインターセプトされます。私の解決戦略はDELEGATE_ONLYに設定されていますが、なぜこれが起こっているのかよくわかりません。Foo.myStaticMethod をstatic にするかどうかは問題ではないか、何か不足しています

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 に答える