Подтвердить что ты не робот

Как автоматически регистрировать ввод/вывод методов в Java?

Сейчас я использую java.util.logging для регистрации точек входа и выхода каждого метода в моем проекте Java. Это очень полезно для меня при отладке.

У меня есть этот кусок кода в начале каждого метода и аналогичный в конце:

if (logger.isLoggable(Level.FINER)) {
    logger.entering(this.getClass().getName(), "methodName");
}

Где "methodName" - это имя метода (hardcoded).

Поэтому мне было интересно, есть ли способ сделать это автоматически без необходимости включать этот код в каждый метод.

4b9b3361

Ответ 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()  );

    }
}

Этот аспект добавляет код ведения журнала после и перед выполнением всех методов в классе "Точка".

Ответ 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(), которая была бы полезной для регистрации входа и выхода из методов, которые вы хотел бы квалифицироваться в определении.