Ищете простой рецепт для аннотации Java - PullRequest
3 голосов
/ 29 октября 2010

Я никогда не писал аннотации на Java.

У меня есть простой класс Java для измерения производительности.Я называю это PerfLog.Вот пример его использования:

public class MyClassToTest {
  public String MyMethod() {
    PerfLog p = new PerfLog("MyClassToTest", "MyMethod");
    try {
       // All the code that I want to time.
       return whatever;
    } finally {
       p.stop();
    }
  }
}

Когда вызывается p.stop (), в файл журнала записывается строка:

2010/10/29T14:30:00.00 MyClassToTest MyMethod elapsed time: 00:00:00.0105

Можно ли переписать PerfLog какАннотация, чтобы я мог написать это вместо этого?

public class MyClassToTest {
  @PerfLog
  public String MyMethod() {
    // All the code I want to time.
    return whatever;
  }
}

Казалось бы, это хороший кандидат для аннотирования: аннотацию легко добавить или убрать;производственная сборка может полностью исключить PerfLog без необходимости удалять аннотации из исходного кода;процессор аннотаций может получить имена классов и методов.

Это легко сделать?Есть ли какой-нибудь рецепт, которому я могу следовать?

Это должна быть Java 5, поэтому я знаю, что должен где-то использовать apt.

Ответы [ 2 ]

1 голос
/ 30 октября 2010

Нет тривиального способа сделать это, используя стандартные инструменты Java. Путь наименьшего сопротивления почти наверняка будет использовать библиотеку в стиле AOP, такую ​​как Google Guice, Spring или AspectJ. Любая домашняя попытка решить эту проблему в конечном итоге приведет к тому, что библиотеки AOP уже сделали бы для вас.

1 голос
/ 29 октября 2010

Рассмотрите возможность использования AOP или Spring - поддерживает аннотации для перехвата вызовов методов и реализации пользовательского кода

В случае, если это звучит интересно, документы Spring AOP находятся здесь: http://static.springsource.org/spring/docs/2.5.x/reference/aop.html

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

Если вы настаиваете на реализации этого самостоятельно (без AOP или AOP с Spring)Вот что я могу предложить (возможно, это не самый лучший метод):

  1. Всегда создавайте ваши bean-компоненты с помощью пользовательского FactoryBean.
  2. В пользовательской реализации FactoryBean запросите класс дляметоды и проверьте, не аннотированы ли они.
  3. Если да, вместо возврата экземпляра самого класса верните прокси поверх экземпляра.
  4. В вызове этого прокси оберните вызовк методу фактического экземпляра с new PerfLog() и p.stop()

Это эффективно, что АОП шмог бы (более сильно) сделать для вас.Однако учтите, что конечные классы, статические методы, классы без интерфейсов и т. Д. Все равно будут проблемой в этом случае (другая игра с мячом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...