В Groovy Есть ли способ украсить каждый класс, чтобы добавить трассировку? - PullRequest
5 голосов
/ 11 сентября 2010

Как мне поступить при каждом вызове метода для каждого моего классного класса, выводя «Entering $ {methodname}» при входе в вызов метода?

Без необходимости оборачивать каждый новый объект, созданный с помощью new TracingDecorator(new Object()) * * 1004

1 Ответ

8 голосов
/ 11 сентября 2010

Вам нужно переопределить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...