Как автоматически регистрировать ввод/вывод методов в Java?
Сейчас я использую java.util.logging
для регистрации точек входа и выхода каждого метода в моем проекте Java. Это очень полезно для меня при отладке.
У меня есть этот кусок кода в начале каждого метода и аналогичный в конце:
if (logger.isLoggable(Level.FINER)) {
logger.entering(this.getClass().getName(), "methodName");
}
Где "methodName" - это имя метода (hardcoded).
Поэтому мне было интересно, есть ли способ сделать это автоматически без необходимости включать этот код в каждый метод.
Ответы
Ответ 1
Я предлагаю использовать Aspect Oriented Programming.
Например, используя компилятор AspectJ (который может быть интегрирован в Eclipse, Emacs и другие IDE), вы можете создать кусок кода, подобного этому:
aspect AspectExample {
before() : execution(* Point.*(..))
{
logger.entering(thisJoinPointStaticPart.getSignature().getName(), thisJoinPointStaticPart.getSignature().getDeclaringType() );
}
after() : execution(* Point.*(..))
{
logger.exiting(thisJoinPointStaticPart.getSignature().getName() , thisJoinPointStaticPart.getSignature().getDeclaringType() );
}
}
Этот аспект добавляет код ведения журнала после и перед выполнением всех методов в классе "Точка".
Ответ 2
Вы должны посмотреть Аспектно-ориентированное программирование. Я предлагаю Spring AOP или AspectJ как что-то, на что вы должны смотреть.
Кроме того, здесь вы найдете краткое руководство по началу работы с Регистрация с Spring AOP
Ответ 3
Как уже было сказано, используйте AOP с @Loggable
аннотация из jcabi -спектры (я разработчик):
@Loggable(Loggable.DEBUG)
public String load(URL url) {
return url.openConnection().getContent();
}
Библиотека также содержит аспект AOP, который понимает эти аннотации и автоматически регистрирует вызовы методов, их аргументы и время выполнения через SLF4J.
Кроме того, отметьте это сообщение в блоге, которое объясняет детали: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html
Ответ 4
Вы пытались посмотреть slf4j? Он имеет LocationAwareLogger, который может автоматически собирать имя метода.
Ответ 5
Вы должны посмотреть Aspect Oriented Programming, в частности, точку подключения around()
, которая была бы полезной для регистрации входа и выхода из методов, которые вы хотел бы квалифицироваться в определении.