Аннотация - Чтение значения элемента во время сборки - PullRequest
6 голосов
/ 15 июня 2011

Можно ли прочитать значение элемента аннотации в время сборки ?Например, если у меня определена следующая аннотация:

public @interface State {
    String stage();
}

, и я аннотирую метод в классе, например так:

public class Foo {
   @State(stage = "build")
   public String doSomething() {
      return "doing something";
   }
}

Как я могу прочитать значение элемента аннотации @State 'stage' во время сборки, в процессоре аннотаций?У меня процессор построен следующим образом:

@SupportedAnnotationTypes(value = {"State"})
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class StageProcessor extends AbstractProcessor { 
    @Override
    public boolean process(Set<? extends TypeElement> elementTypes,
            RoundEnvironment roundEnv) {
        for (Element element : roundEnv.getRootElements()) {
               // ... logic to read the value of element 'stage' from
               // annotation 'State' in here.
        }
        return true;
    }
}

1 Ответ

6 голосов
/ 15 июня 2011

Не самый лучший ответ, поскольку я сам этого не делал, но, учитывая, что прошло 3 часа, я сделаю все, что могу.

Обзор обработки аннотаций

Если обработка аннотации не отключено с помощью опции -proc: none, компилятор ищет любой процессоры аннотации, которые имеется в наличии. Путь поиска может быть указывается с помощью -processorpath вариант; если это не дано, пользователь путь к классу используется. Процессоры расположен с помощью сервиса файлы конфигурации провайдера с именем
META-INF / услуги / javax.annotation.processing.Processor на пути поиска. Такие файлы должны содержать названия любой аннотации процессоры, которые будут использоваться, перечислены по одному на линия. В качестве альтернативы, процессоры могут быть указано явно, используя -процессорная опция.

Похоже, вам нужно создать файл с именем javax.annotation.processing.Processor в папке META-INF/services, в котором перечислены имена ваших процессоров аннотаций, по одному на строку.

РЕДАКТИРОВАТЬ: Итак, я считаю, что код для чтения аннотаций будет что-то вроде ...

    for (Element element : roundEnv.getRootElements()) {
        State state = element.getAnnotation(State.class);
        if(state != null) {
            String stage = state.stage();
            System.out.println("The element " + element + " has stage " + stage);
        }
    }

Реальный пример процессора аннотаций можно найти здесь .

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