在Groovy中有没有办法装饰每个类来添加跟踪?

Kyl*_*yle 5 groovy

当我进入方法调用时,我将如何进行每个groovy类的每个方法调用打印"输入$ {methodname}"?

无需包装我创建的每个新对象new TracingDecorator(new Object())

Ted*_*eid 8

您需要在所有类上覆盖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")
Run Code Online (Sandbox Code Playgroud)

这打印

before bar, args = []
in bar
after bar
before baz, args = [qux]
in baz with qux
after baz
Run Code Online (Sandbox Code Playgroud)