2013-10-25 64 views
1

我想了解invokeMethod如何攔截Groovy中的方法調用。我似乎無法得到最基本的例子工作。Groovy MOP invokeMethod

class Person implements GroovyInterceptable { 

    def invokeMethod(String name,args) { 
     println "called invokeMethod $name $args" 
    } 

    def greet() { 
     println "Hello from greet()" 
    } 

} 

def p = new Person() 
p.greet() 

如果我嘗試運行這個例子,我得到以下錯誤。我錯過了什麼?

Caught: java.lang.StackOverflowError 
java.lang.StackOverflowError 
    at Person.invokeMethod(Person.groovy:4) 
    at Person.invokeMethod(Person.groovy:4) 
    at Person.invokeMethod(Person.groovy:4) 
    ... 
+2

println是Groovy對象的一種方法,它被抓到了,因此發送給我一個無限循環。 使用不受我們攔截點影響的System.out.println修復了問題。感謝Venkat(編程Groovy 2) – cfaddict

回答

1

您需要在截取後調用invokeMethod的實際方法。

class Person implements GroovyInterceptable { 
    def invokeMethod(String name,args) { 
     System.out.println "called invokeMethod $name $args" 
     metaClass.getMetaMethod(name, args).invoke(this, args) 
    } 

    def greet() { 
     System.out.println "Hello from greet()" 
    } 
} 

def p = new Person() 
p.greet() 

是的,你是正確的關於println。必須使用SOP。