4
我會如何在進入方法調用時使每個我的groovy類的每個方法調用打印「輸入$ {methodname}」?在Groovy有沒有一種方法來裝飾每個類來添加跟蹤?
無需用new TracingDecorator(new Object())
來包裝我創建的每個新對象?
我會如何在進入方法調用時使每個我的groovy類的每個方法調用打印「輸入$ {methodname}」?在Groovy有沒有一種方法來裝飾每個類來添加跟蹤?
無需用new TracingDecorator(new Object())
來包裝我創建的每個新對象?
您需要重寫所有類的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