2013-07-03 51 views
1

由於每個Groovy的對象實現的GroovyObject接口,我會嘗試重寫的InvokeMethod(),這裏是我的測試:不能覆蓋invokeMethod中從繼承的GroovyObject

class MyGrrovyClass { 

    static test(){ 
     println 'i am in test' 
    } 

    Object invokeMethod(String name, Object args){ 
    log.info('method intercepted') 
    def metaClass = InvokerHelper.getMetaClass(this) 
    def result = metaClass.invokeMethod(this, name, args) 
    return result 
    } 

    public static void main(String[] args) { 
    test() 
    } 
} 

但似乎不工作,我從來沒有見過的日誌信息在我的控制檯

我的第二個問題是:GroovyInterceptable是的GroovyObject的子接口,我重寫的GroovyObject直接invokeMethod中,我實現GroovyInterceptable接口invokeMethod中說之間有什麼區別?

感謝

回答

3

根據文檔(http://groovy.codehaus.org/Using+invokeMethod+and+getProperty)必須實現GroovyInterceptable攔截現有的方法我覺得這回答你的第一個和第二個問題!

我做了一些細微的改變,讓你的示例類工作,雖然很驚訝地看到我的println被攔截,但沒有System.out.println - 這意味着我得到了一個堆棧溢出,因爲我原來有一個簡單的println invokeMethod和遞歸調用。

class MyGrrovyClass implements GroovyInterceptable { 


    def test(){ 
     println 'i am in test' 
    } 


    def invokeMethod(String name, args){ 

     System.out.println('method intercepted: '+ name) 

     def result= metaClass.getMetaMethod(name, args).invoke(this, args) 
    } 
} 

def mgc= new MyGrrovyClass() 
mgc.test()