Я действительно засучил рукава и впервые пытаюсь понять аннотации Java, и прочитал статьи Sun, Oracle и Wikipedia по этой теме. Их легко понять концептуально, но мне сложно сложить вместе все кусочки головоломки.
Следующий пример, вероятно, ужасен с инженерной точки зрения, но просто пошутите меня (это пример !).
Допустим, у меня есть следующий класс:
public Widget { // ... public void foo(int cmd) { switch(cmd) { case 1: function1(); break; case 2: function2(); break; case 3: default: function3(); break; } } }
Теперь, где-то еще в моем проекте, У меня есть другой класс, SpaceShuttle , в котором есть метод под названием blastOff () :
public class SpaceShuttle { // ... public void blastOff() { // ... } }
Теперь я хочу настроить аннотацию под названием Widgetize , чтобы любые методы, помеченные @Widgetize , будут вызывать Widget :: foo (int) перед их собственным вызовом.
@interface Widgetize { int cmd() default 2; }
Итак, теперь давайте вернемся к SpaceShuttle:
public class SpaceShuttle { // ... @Widgetize(3) public void blastOff() { // Since we pass a cmd of "3" to @Widgetize, // Widget::function3() should be invoked, per // Widget::foo()'s definition. } }
Увы, мои вопросы!
Полагаю, что где-то мне нужно определить обработчик аннотаций; класс Java, который будет указывать, что делать при обнаружении аннотаций @Widgetize (int), да? Или это происходит, скажем, в XML-файлы конфигурации, которые загружаются в apt (например, как муравей читает файлы build.xml)?
Изменить: Если я был прав относительно этих процессоров аннотаций в вопросе № 1 выше, то как можно ли «сопоставить» / «зарегистрировать» / сообщить об этих процессорах apt?
В сценариях сборки apt обычно запускается перед javac, поэтому изменения на основе аннотаций или генерация кода происходят до компиляция? (Это вопрос типа передовой практики.)
Спасибо и прошу прощения за мои образцы кода, они оказались намного громоздче, чем я предполагал (!)