在Groovy中,有没有一种方法可以修饰每个类以添加跟踪?

在Groovy中,有没有一种方法可以修饰每个类以添加跟踪?,groovy,Groovy,我如何让我的每个groovy类的每个方法调用在进入方法调用时打印“Entering${methodname}” 不必包装我用新建TracingDecorator(new object())?创建的每个新对象,您就需要在所有类上重写metaClass.invokeMethod,并让它用跟踪内容包装对原始类的方法调用 您可能会浏览从类加载器获得的类列表,该类列表与某种命名/包模式相匹配,然后针对其中的每一个,使用日志执行类似于decorateMethodsWithLogging的操作: class

我如何让我的每个groovy类的每个方法调用在进入方法调用时打印“Entering${methodname}”


不必包装我用
新建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

您需要在所有类上重写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