Хотя это еще не фактический практический ответ на ваш вопрос (некоторые хорошие ответы были относительно AOP), я считаю, что концепция ARM в Java 7 должна быть жизнеспособным вариантом для реализации что-то вроде этого в небольшом масштабе.
Вы можете определить класс ведения журналов утилит и фабрику для создания этого класса, что-то вроде следующего:
public class TimerFactory
{
private static final Logger log = ...; // Obtain however
static class Timer implements Disposable<RuntimeException>
{
private final long startTime;
private final String name;
private Timer(String name)
{
this.name = name;
startTime= System.currentTimeMillis();
log.info("begin - " + name);
}
public void close()
{
final long t2 = System.currentTimeMillis();
log.info("end - " + name + ", took " + (t2 - t1) + "ms.");
}
}
public static Timer getTimer(String name)
{
return new Timer(name);
}
}
Теперь, с учетом этого шаблона (по сути, инкапсуляция вашего поведения при ведении журнала), его можно назвать следующим образом:
public void m() {
try (TimerFactory.getTimer("m()")) {
/* method body */
}
}
Первый метод журнала вызывается при входе в блок try, и время начала записывается. При выходе из блока try ресурс (в данном случае Timer
) автоматически будет «закрыт», что приведет к вычислению и регистрации последнего времени. Также обратите внимание, что, поскольку это блок try
, регистрация конца будет происходить независимо от того, выброшено исключение или нет. Ваш исходный код, вероятно, должен использовать блок try-finally, чтобы гарантировать, что регистрация фактически завершена.
Очевидно, что для этого по-прежнему необходимо размещать некоторый код журнала на каждом сайте, так что на самом деле это не замена умных точек и AOP, даже после выхода Java 7. Тем не менее, если вы обнаружите, что время от времени включаете ведение журнала, возможно, в несколько методов, этот шаблон является хорошим способом абстрагироваться от проблем, связанных с ведением журнала, и позволяет повторно использовать его с минимальным количеством шаблонов.