Можно ли использовать Mirror API для рекурсивной проверки аннотаций во время обработки аннотаций - PullRequest
0 голосов
/ 25 декабря 2018

Предположим, у меня есть структура класса, например:

@MyAnnotationOne
class A { 
    private String id;
    private B b;

    public static class B {
        private C c;

        @MyAnnoationOne
        public static class C {
            @MyAnnotationTwo
            private String annotatedString;
        }
    }
}

Я использую обработку аннотаций для генерации кода.Если я обрабатываю @MyAnnotationOne, то с помощью API Mirror я могу получить все поля в классе A и классе C.

Я хочу знать, есть ли способ найти какое-либо из полей вкласс A, идущий вниз по иерархии, содержит аннотацию @MyAnnotationOne или @MyAnnotationTwo.Найти кого-либо будет достаточно.

Я пытался найти решение, но нашел, что некоторые говорят, что, поскольку обработка аннотации происходит на этапе предварительной компиляции, информация может быть недоступна.Пожалуйста, дайте мне знать, если есть какое-то решение, которое вы могли бы знать.Это было бы очень полезно.

1 Ответ

0 голосов
/ 03 января 2019

Вы можете настроить, будут ли аннотации сохраняться во время выполнения или нет.Вы аннотируете свой собственный тип аннотации с помощью метааннотации java.lang.annotation.Retention, указывая одно из значений из перечисления java.lang.annotation.RetentionPolicy.

RUNTIME Аннотации должны записываться в файле классакомпилятор и сохраняется виртуальной машиной во время выполнения, поэтому они могут считываться отражательно.

CLASS Аннотации должны записываться компилятором в файл класса, но не должны сохраняться виртуальной машиной во время выполнения.

SOURCE Аннотации должны удаляться компилятором.

EDIT Если вы создаете процессор аннотаций:

  • ваш код выполняется во время этой (предварительной) фазы компиляции, поэтому все аннотации должны присутствовать.
  • Зеркальный API устарел, см. javax.lang.model... и javax.annotation.processing

Если выпереопределив javax.annotation.processing.AbstractProcessor.process(), вы получите RoundEnvironment с методами получения модели Element s, включая наборы, отфильтрованные по определенным типам аннотаций.И учитывая Element вы можете getEnclosedElements() и на этих getAnnotation(annotationType).

...