Используя AspectJ и log4j , вы можете использовать это. Скомпилируйте ваш код с помощью компилятора ajc вместо javac, а затем запустите как обычно с исполняемым файлом java.
Вам необходимо иметь aspectjrt.jar и log4j.jar на пути к классам.
import org.aspectj.lang.*;
import org.apache.log4j.*;
public aspect TraceMethodCalls {
Logger logger = Logger.getLogger("trace");
TraceMethodCalls() {
logger.setLevel(Level.ALL);
}
pointcut traceMethods()
//give me all method calls of every class with every visibility
: (execution(* *.*(..))
//give me also constructor calls
|| execution(*.new(..)))
//stop recursion don't get method calls in this aspect class itself
&& !within(TraceMethodCalls);
//advice before: do something before method is really executed
before() : traceMethods() {
if (logger.isEnabledFor(Level.INFO)) {
//get info about captured method and log it
Signature sig = thisJoinPointStaticPart.getSignature();
logger.log(Level.INFO,
"Entering ["
+ sig.getDeclaringType().getName() + "."
+ sig.getName() + "]");
}
}
}
Ознакомьтесь с документацией AspectJ о том, как изменить вызовы TraceMethodCalls.
// e.g. just caputre public method calls
// change this
: (execution(* *.*(..))
// to this
: (execution(public * *.*(..))
Относительно
Также я хочу напечатать список в
.log в этой строке:
this.logger.debug("names: {}", xxxxx);
По умолчанию поддерживается slf4j / logback. Просто сделай
logger.debug("names: {}", names);
например
List<String> list = new ArrayList<String>();
list.add("Test1"); list.add("Test2"); list.add("Test3");
logger.debug("names: {}", list);
//produces
//xx::xx.xxx [main] DEBUG [classname] - names: [Test1, Test2, Test3]
Или вы хотите что-то особенное?