Тогда иди с AspectJ

у проследить начало [и окончание] функций, вызываемых в Java, например, следующий код:

    public void foo() {
  System.out.println("begin of foo()");
  ...
  System.out.println("e-n-d of foo()");
 }

Но ведение кода дампаSystem.out.println это что-то утомительное и подверженное ошибкам, поскольку в классе могут быть десятки функций.

Любая хорошая идея может облегчить эту работу? Я не хочу выписывать дампы по всему файлу.

Реализация обоих или одного из начального и конечного следов является допустимым.
Но, если это невозможно, записи о том, что функция была вызвана, также полезны. Я имею в виду, что не имеет значения точное начало и конец, просто сказать, что функция была вызвана.

 david van brink13 янв. 2011 г., 07:47
Я считаю, что AspectJ предназначен для подобных вещей. Это изменит ваш скомпилированный байт-код с указанными вами хуками. Никогда не использовал это, но я думаю, что это то, что он делает.
 Aravind R. Yarram13 янв. 2011 г., 07:54

Ответы на вопрос(4)

BTrace - он похож на AspectJ, но может подключаться к работающему Java-приложению и применять код регистрации на лету (он также может отсоединяться от приложения, удаляя весь введенный код, но оставляя приложение работающим, как было до использования).BTrace)

Для того, чтобы использоватьBTrace вы бы написали простой скрипт трассировки, который POJO аннотированBTrace аннотации (и некоторые ограничения относительно того, что можно использовать, чтобы избежать сбоя целевого приложения).

В этом случае скрипт будет выглядеть так:

@BTrace public class FooTracer {
  @OnMethod(clazz="Bar", method="foo")
  public static void onEntry() {
    println("begin of foo()");
  }

  @OnMethod(clazz="Bar", method="foo", [email protected](Kind.RETURN))
  public static void onExit() {
    println("end of foo");
  }
}

Есть еще много вещей, которые вы можете сделать сBTrace - просто обратитесь к руководству пользователя и примерам. Номинально это консольное приложение, но есть интеграция вVisualVM опыт работы сBTrace приятнее

Решение Вопроса

Простая замена дляSystem.out звонки будут использовать каркас регистрации. Затем вы можете включать и выключать информацию в соответствии с выбранным «уровнем регистрации»

Более сложные решения будут использовать методы аспектно-ориентированного программирования (например, предоставленные AspectJ), но это ставит вас на крутой курс обучения.

Возможно, подход, основанный на инструментах, соответствует вашим потребностям: так называемые «профилировщики» могут «инструментализировать» ваш код и сообщать, какой именно метод был вызван во время выполнения.

 CurtainDog13 янв. 2011 г., 08:13
Последнее, на мой взгляд, является наиболее желательным, поскольку я сомневаюсь, что такое поведение было бы желательно в производственном коде, и зачем заново изобретать колесо с помощью AOP. Что-то вроде TPTP для Eclipse должно быть способно выдавать дамп всех вызовов функций и даже времени. Вывод, вероятно, будет в каком-то двоичном формате, но это может быть нормально, учитывая, что он может быть массовым.
 user43565713 янв. 2011 г., 08:50
@CurtainDog: Большое спасибо. Действительно, мне нужно одно из языков, связанных с решением.
 Andreas_D13 янв. 2011 г., 09:06
@ user435657 - что ты собираешься делать? Профилировщик (какTPTP) всегда поставляется со средством просмотра отчетов, онипредназначенный для поддержки анализа задач. Вам не нужно писать ни одной строки кода - просто запустите приложение из профилировщика, и оно записывает все вызовы методов.
 user43565713 янв. 2011 г., 08:47
Я не буду прикреплять код к этим функциям, потому что это не мой код, и это потребует много работы. AspectJ может работать. Но что такое «профилировщики», и что такое инструментальный подход, можете ли вы привести пример или ссылку. Это будет оценено. Заранее спасибо.

АОП может быть использован. Например, аспект J.

 user43565713 янв. 2011 г., 08:52
!! Должен ли я добавить дополнительный код к этим функциям при использовании aspectJ.
 卢声远 Shengyuan Lu13 янв. 2011 г., 09:16
Нет необходимости писать дополнительный код на Java. Напишите код журнала в aspectJ, затем смешайте код aspectJ с байтовым кодом Java, процесс называется «волной». Простой пример:javaworld.com/javaworld/jw-03-2002/jw-0301-aspect2.html?page=2

static Logger log = Logger.getLogger(
                      log4jExample.class.getName());

public void loggedMethod() {

 log.info("begin of loggedMethod()");
  ...
 log.info("e-n-d of loggedMethod()");
}
 Feras Odeh13 янв. 2011 г., 08:45
Тогда иди с AspectJ
 user43565713 янв. 2011 г., 08:38
Извините, что я имею в виду, что нужно добавить любой код добавления в журнал / запись о том, что функция была вызвана.

Ваш ответ на вопрос