Аннотации Java и apt (основы)

Я действительно засучил рукава и впервые пытаюсь понять аннотации 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.
    }
}

Увы, мои вопросы!

  1. Полагаю, что где-то мне нужно определить обработчик аннотаций; класс Java, который будет указывать, что делать при обнаружении аннотаций @Widgetize (int), да? Или это происходит, скажем, в XML-файлы конфигурации, которые загружаются в apt (например, как муравей читает файлы build.xml)?

  2. Изменить: Если я был прав относительно этих процессоров аннотаций в вопросе № 1 выше, то как можно ли «сопоставить» / «зарегистрировать» / сообщить об этих процессорах apt?

  3. В сценариях сборки apt обычно запускается перед javac, поэтому изменения на основе аннотаций или генерация кода происходят до компиляция? (Это вопрос типа передовой практики.)

Спасибо и прошу прощения за мои образцы кода, они оказались намного громоздче, чем я предполагал (!)

5
задан Eugie 28 January 2011 в 15:08
поделиться