2010-08-27 31 views
1

我有一個封閉的對象美孚內和瓶蓋內我定義了一個名爲方法「myStaticMethod」我想一勞永逸地解決關閉被稱爲對象之外。我也碰巧在我的對象Foo中使用了相同名稱的「靜態方法」。當我調用閉包時,我將'解決策略'設置爲DELEGATE_ONLY,以攔截在閉包中定義的myStaticMethod的呼叫。Groovy的methodMissing

我試圖通過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 
    } 
} 

回答

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

爲了解決這個問題,我結束了正確調用關閉前覆蓋時,InvokeMethod FooTests

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

雖然試圖解決這個問題,我發現了一個非常奇怪的方法來截獲缺少的靜態方法。將來可能對你們中的一些人有用。

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

-Ken

+0

+1我不知道有關$ static_methodMissing招,那可能是靜態$ static_methodMissing有用 – 2010-08-28 14:22:38

+0

+1(字符串名稱args)招!這只是我的一天!我能夠用它實現一個很好的配置DSL – 2015-10-19 12:41:07