Groovy методMissing - PullRequest
       14

Groovy методMissing

1 голос
/ 28 августа 2010

У меня есть замыкание внутри объекта 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
  }
}

Ответы [ 2 ]

5 голосов
/ 28 августа 2010

Чтобы решить проблему, я переопределил invokeMethod прямо перед вызовом замыкания в FooTests

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

Пытаясь решить эту проблему, я обнаружил очень странный способ перехвата недостающих статических методов. Может быть полезным для некоторых из вас в будущем.

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

1007 * Кен *

3 голосов
/ 28 августа 2010

Статические методы, к сожалению, не перехватываются разрешением свойства closure.Я знаю, что единственный способ перехватить их - переопределить статический метакласс 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()
...