2010-08-27 6 views
1

J'ai une fermeture dans un objet Foo et à l'intérieur de la fermeture i définir une méthode appelée « myStaticMethod » que je veux résoudre une fois que la fermeture est appelé en dehors de l'objet Foo. Il m'arrive aussi d'avoir «intentionnellement» une méthode statique dans mon objet Foo avec le même nom. Quand j'appelle la fermeture je mets la 'stratégie de résolution' à DELEGATE_ONLY pour intercepter l'appel à myStaticMethod qui est défini dans la fermeture.Groovy methodMissing

J'ai essayé d'atteindre cela par missingMethod mais la méthode n'est jamais interceptée. Quand je fais le Foo. myStaticMethod non statique, la méthode est interceptée. Je ne comprends pas très bien pourquoi cela se produit bien que ma stratégie de résolution soit définie sur DELEGATE_ONLY. ayant la Foo.myStaticMethod statique ou non ne devrait pas importer ou je manque quelque chose

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 
    } 
} 

Répondre

3

méthodes statiques, malheureusement, ne sont pas interceptées par la résolution de la propriété de fermeture. La seule façon que je sais d'intercepter celles-ci est de passer outre la métaclasse invokeMethod statique sur la classe qui possède la fermeture, ex:

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() 
5

Pour résoudre le problème, je me suis retrouvé droit inaliénable du invokeMethod avant d'appeler la fermeture Tout en essayant de résoudre ce problème, j'ai découvert une façon très étrange d'intercepter les méthodes statiques manquantes. Cela pourrait être utile à certains d'entre vous dans le futur.

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

-Ken

+0

+1 Je ne savais pas l'affaire static_methodMissing $, qui pourrait être utile –

+0

+1 pour la static_methodMissing statique $ (String name, args) trick! Ca vient de faire ma journée! J'ai pu mettre en place une belle configuration DSL avec ça –