Вам нужно переопределить 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