2010-09-11 1 views
4

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

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

ответ

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 
Смежные вопросы