2013-06-12 55 views
0

我試圖用Groovy AOP方法增強我的Grails項目。但是,如果我用閉包覆蓋invokeMethod,我總是得到StackOverflowError。這裏是我的測試代碼,我可以用groovy 2.1.3重現錯誤,謝謝!Groovy:用覆蓋率覆蓋invokeMethod時出現StackOverflowError

class A implements GroovyInterceptable 
{ 
    void foo(){ 
     System.out.println("A.foo"); 
    } 
} 

class B extends A 
{ 
    void foo(){ 
     System.out.println("B.foo"); 
     super.foo(); 
    } 
} 

def mc = B.metaClass; 

mc.invokeMethod = { String name, args -> 

    // do "before" and/or "around" work here 

    try { 
     def value = mc.getMetaMethod(name, args).invoke(delegate, args) 

     // do "after" work here 

     return value // or another value 
    } 
    catch (e) { 
     // do "after-throwing" work here 
    } 
} 


B b = new B(); 
b.foo(); 

回答

2

的樣子,如果你有super()一個電話,然後metaClass上使用緩存找對方法,並最終拋出一個StackOverflow上。在這種情況下,如果你metaClass而不是B,它一切正常。

def mc = A.metaClass

我可以推斷這種方式,實現類直接GroovyInterceptable應該重寫invokeMethod

@Source MetaClassImpl

+0

它的工作原理就像一個魅力!根據MetaClassImpl的源代碼,您指出,我想你確實是對的,我們應該總是在實現GroovyInterceptable的類中重寫invokeMethod。 –