2010-09-11 81 views

回答

7

您需要重寫所有類的metaClass.invokeMethod,然後讓它將方法調用與您的跟蹤內容一起包裝到原始類中。

你可以通過類的列表,你從類加載器獲得匹配某種命名/包裝的圖案,然後爲每個大概旋轉做這樣的事情decorateMethodsWithLogging:

class Foo { 
    def bar() { 
     println "in bar" 
    } 

    def baz(String name) { 
     println "in baz with $name" 
    } 
} 



def decorateMethodsWithLogging(clazz) { 
    def mc = clazz.metaClass 

    mc.invokeMethod = { String name, args -> 
     println "before $name, args = $args" 
     def result = mc.getMetaMethod(name, args).invoke(delegate, args) 
     println "after $name" 
     return result 
    } 
} 


decorateMethodsWithLogging(Foo.class) 

def f = new Foo() 
f.bar() 
f.baz("qux") 

此打印

before bar, args = [] 
in bar 
after bar 
before baz, args = [qux] 
in baz with qux 
after baz 
相關問題