Интерфейс Processor
- Все известные реализующие классы:
- AbstractProcessor
public interface Processor
Интерфейс для обработчика аннотаций.
Обработка аннотаций происходит в последовательности раундов. В каждом раунде обработчик может быть запрошен на обработку подмножества аннотаций, найденных в исходных и class-файлах, сгенерированных в предыдущем раунде. Входные данные для первого раунда обработки — это начальные входные данные для выполнения инструмента; эти начальные входные данные можно рассматривать как вывод виртуального нулевого раунда обработки. Если обработчик был запрошен на обработку в определенном раунде, он будет запрошен на обработку в последующих раундах, включая последний, даже если для него нет аннотаций для обработки. Инфраструктура инструмента также может запросить обработчик на обработку файлов, неявно сгенерированных в процессе работы инструмента.
Каждая реализация Processor должна предоставлять публичный конструктор без аргументов, который будет использоваться инструментами для создания экземпляра обработчика. Инфраструктура инструмента будет взаимодействовать с классами, реализующими этот интерфейс, следующим образом:
- Если существующий объект
Processorне используется, для создания экземпляра обработчика инструмент вызывает конструктор без аргументов класса обработчика. - Далее инструмент вызывает метод
initс соответствующимProcessingEnvironment. - Затем инструмент вызывает
getSupportedAnnotationTypes,getSupportedOptionsиgetSupportedSourceVersion. Эти методы вызываются только один раз за выполнение, а не в каждом раунде. - По мере необходимости инструмент вызывает метод
processобъектаProcessor; новый объектProcessorне создается для каждого раунда.
Инструмент использует процесс обнаружения для поиска обработчиков аннотаций и определения, следует ли их запускать. Настройка инструмента позволяет управлять набором потенциальных обработчиков. Например, для JavaCompiler список кандидатных обработчиков для запуска можно установить непосредственно или управлять им с помощью пути поиска, используемого для поиска в стиле сервиса. Другие реализации инструмента могут иметь различные механизмы настройки, такие как параметры командной строки; подробную информацию см. в документации конкретного инструмента. Какие обработчики инструмент просит запустить, зависит от типов аннотаций присутствующих в корневых элементах, от типов аннотаций, поддерживаемых обработчиком, и от того, заявляет ли обработчик обрабатываемые типы аннотаций. Обработчик будет запрошен на обработку подмножества типов аннотаций, которые он поддерживает, возможно, пустого набора. Для данного раунда инструмент вычисляет набор типов аннотаций, присутствующих в элементах, вложенных в корневые элементы. Если присутствует хотя бы один тип аннотации, обработчики, заявляющие о типах аннотаций, удаляются из набора несовпадающих типов аннотаций. Когда набор пуст или больше обработчиков недоступны, раунд завершен. Если типов аннотаций нет, обработка аннотаций все равно происходит, но только универсальные обработчики, которые поддерживают обработку всех типов аннотаций, "*", могут заявить о (пустом) наборе типов аннотаций.
Тип аннотации считается присутствующим, если имеется хотя бы одна аннотация данного типа, присутствующая на элементе, вложенном в корневые элементы раунда. Для этой цели параметр типа считается вложенным в свой обобщенный элемент. Аннотации на использованиях типов, в отличие от аннотаций на элементах, игнорируются при вычислении того, присутствует ли тип аннотации.
Аннотация присутствует, если она соответствует определению присутствия, приведенному в AnnotatedConstruct. Вкратце, аннотация считается присутствующей для целей обнаружения, если она непосредственно присутствует или присутствует через наследование. Аннотация не считается присутствующей в силу того, что она обернута контейнерной аннотацией. Оперативно это эквивалентно тому, что аннотация присутствует на элементе, если и только если она будет включена в результаты вызова Elements.getAllAnnotationMirrors(Element) для данного элемента. Поскольку аннотации внутри контейнерных аннотаций не считаются присутствующими, для правильной обработки повторяемых типов аннотаций обработчикам рекомендуется включать как тип повторяемой аннотации, так и содержащий тип аннотации в набор поддерживаемых типов аннотаций обработчика.
Обратите внимание, что если обработчик поддерживает "*" и возвращает true, все аннотации заявляются. Поэтому универсальный обработчик, используемый, например, для реализации дополнительных проверок на валидность, должен возвращать false, чтобы не препятствовать работе других таких проверок.
Если обработчик генерирует необработанное исключение, инструмент может прекратить работу других активных обработчиков аннотаций. Если обработчик поднимает ошибку, текущий раунд завершится, а последующий раунд укажет, что была поднята ошибка. Поскольку обработчики аннотаций работают в кооперативной среде, обработчик должен генерировать необработанное исключение только в ситуациях, когда восстановление от ошибок или их сообщение невозможны.
Среда инструмента не обязана поддерживать обработчики аннотаций, которые обращаются к ресурсам среды, как в рамках каждого раунда, так и межраундово, в многопоточном режиме.
Если методы, возвращающие конфигурационную информацию об обработчике аннотаций, возвращают null, возвращают другие недопустимые входные данные или генерируют исключение, инфраструктура инструмента должна обрабатывать это как условие ошибки.
Для повышения надежности при работе с различными реализациями инструментов обработчик аннотаций должен обладать следующими свойствами:
- Результат обработки заданного входного значения не зависит от наличия или отсутствия других входных данных (ортогональность).
- Обработка одного и того же входного значения приводит к одному и тому же результату (согласованность).
- Обработка входного значения A, за которой следует обработка входного значения B, эквивалентна обработке B, за которой следует обработка A (коммутативность).
- Обработка входного значения не зависит от наличия результата обработки других обработчиков аннотаций (независимость).
Интерфейс Filer обсуждает ограничения, накладываемые на обработчики в отношении работы с файлами.
Обратите внимание, что реализаторам этого интерфейса может быть удобно расширить AbstractProcessor, а не реализовывать этот интерфейс напрямую.
- С:
- 1.6
Методы
| Модификатор и тип | Метод и описание |
|---|---|
Iterable<? extends Completion> |
getCompletions(Element element,
AnnotationMirror annotation,
ExecutableElement member,
String userText) Возвращает инструменту итератор с предложенными завершениями аннотации. |
Set<String> |
getSupportedAnnotationTypes() Возвращает имена поддерживаемых этим обработчиком типов аннотаций. |
Set<String> |
getSupportedOptions() Возвращает параметры, распознаваемые этим обработчиком. |
SourceVersion |
getSupportedSourceVersion() Возвращает последнюю поддерживаемую версию исходного кода этим обработчиком аннотаций. |
void |
init(ProcessingEnvironment processingEnv) Инициализирует обработчик с использованием среды обработки. |
boolean |
process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) Обрабатывает набор типов аннотаций на элементах типа, полученных с предыдущего раунда, и возвращает, заявляет ли этот обработчик на эти типы аннотаций. |
Методы
getSupportedOptions
Set<String> getSupportedOptions()
Возвращает опции, распознаваемые этим процессором. Реализация инструмента обработки должна предоставить способ передачи опций, специфичных для процессора, отдельно от опций, переданных самому инструменту, см. getOptions.
Каждая возвращаемая строка в наборе должна быть последовательностью идентификаторов, разделенных точкой:
- SupportedOptionString:
- Identifiers
- Identifiers:
- Identifier
- Identifier
.Identifiers - Identifier
- Identifier:
- Синтаксический идентификатор, включая ключевые слова и литералы
Инструмент может использовать эту информацию, чтобы определить, являются ли какие-либо предоставленные пользователем опции нераспознанными ни одним процессором, в этом случае он может захотеть сообщить об ошибке.
- Возвращает:
- опции, распознаваемые этим процессором, или пустой набор, если их нет
- См. также:
SupportedOptions
getSupportedAnnotationTypes
Set<String> getSupportedAnnotationTypes()
Возвращает имена типов аннотаций, поддерживаемых этим процессором. Элемент результата может быть каноническим (полностью квалифицированным) именем поддерживаемого типа аннотации. В качестве альтернативы, он может быть в форме "name.*", представляющей набор всех типов аннотаций с каноническими именами, начинающимися с "name.". Наконец, "*" само по себе представляет набор всех типов аннотаций, включая пустой набор. Обратите внимание, что процессор не должен заявлять "*" , если он на самом деле не обрабатывает все файлы; объявление ненужных аннотаций может привести к замедлению производительности в некоторых средах.
Каждая возвращаемая строка в наборе должна быть принята следующей грамматикой:
- SupportedAnnotationTypeString:
-
TypeName DotStaropt
* - DotStar:
-
.*
- Возвращает:
- имена типов аннотаций, поддерживаемых этим процессором
- См. также:
SupportedAnnotationTypes
getSupportedSourceVersion
SourceVersion getSupportedSourceVersion()
Возвращает последнюю поддерживаемую версию исходного кода этим процессором аннотаций.
- Возвращает:
- последнюю поддерживаемую версию исходного кода этим процессором аннотаций.
- См. также:
-
SupportedSourceVersion,ProcessingEnvironment.getSourceVersion()
init
void init(ProcessingEnvironment processingEnv)
Инициализирует процессор с помощью среды обработки.
- Параметры:
-
processingEnv- среда для функций, предоставляемых инструментом фреймворка процессору
process
boolean process(Set<? extends TypeElement> annotations,
RoundEnvironment roundEnv) Обрабатывает набор типов аннотаций на элементах типов, полученных из предыдущего раунда, и возвращает, заявлены ли эти типы аннотаций этим процессором. Если true возвращается, типы аннотаций заявлены, и последующим процессорам не будет предложено их обрабатывать; если false возвращается, типы аннотаций не заявлены, и последующим процессорам может быть предложено их обработать. Процессор может всегда возвращать одно и то же булево значение или изменять результат, основываясь на выбранных критериях.
Входной набор будет пустым, если процессор поддерживает "*" , а корневые элементы не имеют аннотаций. A Processor должен корректно обрабатывать пустой набор аннотаций.
- Параметры:
-
annotations- типы аннотаций, запрошенные для обработки -
roundEnv- среда для получения информации о текущем и предыдущем раунде - Возвращает:
- являются ли типы аннотаций заявленными этим процессором
getCompletions
Iterable<? extends Completion> getCompletions(Element element,
AnnotationMirror annotation,
ExecutableElement member,
String userText) Возвращает инфраструктуре инструмента итератор предлагаемых дополнений к аннотации. Поскольку запрашиваются дополнения, информация, предоставляемая об аннотации, может быть неполной, как если бы для фрагмента исходного кода. Процессор может вернуть пустой итератор. Процессоры аннотаций должны сосредоточить свои усилия на предоставлении дополнений для членов аннотаций с дополнительными ограничениями по валидации, известными процессору, например, членом int , значение которого должно быть между 1 и 10, или членом-строкой, который должен быть распознан известной грамматикой, например, регулярным выражением или URL.
Поскольку моделируются неполные программы, некоторые параметры могут содержать только частичную информацию или быть null. По крайней мере один из element и userText должен быть не-null. Если element не null, annotation и member могут быть null. Процессоры не должны вызывать NullPointerException , если некоторые параметры null; если у процессора нет предложений по дополнениям, основанных на предоставленной информации, можно вернуть пустой итератор. Процессор также может вернуть одно дополнение со строкой значения по умолчанию и сообщением, описывающим, почему нет дополнений.
Дополнения содержат информацию и могут отражать дополнительные проверки валидности, выполняемые процессорами аннотаций. Например, рассмотрим простую аннотацию:
@MersennePrime {
int value();
} (Простое число Мерсенна — это простое число вида 2n - 1.) Учитывая AnnotationMirror для этого типа аннотации, можно вернуть список всех таких простых чисел в диапазоне int , не проверяя другие аргументы getCompletions: import static javax.annotation.processing.Completions.*;
...
return Arrays.asList(of("3"),
of("7"),
of("31"),
of("127"),
of("8191"),
of("131071"),
of("524287"),
of("2147483647")); Более информативный набор дополнений включал бы количество каждого простого числа: return Arrays.asList(of("3", "M2"),
of("7", "M3"),
of("31", "M5"),
of("127", "M7"),
of("8191", "M13"),
of("131071", "M17"),
of("524287", "M19"),
of("2147483647", "M31")); Однако, если userText доступно, можно проверить, является ли только подмножество простых чисел Мерсенна допустимым. Например, если пользователь ввёл @MersennePrime(1, значение
userText будет "1"; и только два простых числа могут быть возможными дополнениями: return Arrays.asList(of("127", "M7"),
of("131071", "M17")); Иногда невозможны никакие допустимые дополнения. Например, нет простого числа Мерсенна в заданном диапазоне, начинающегося с 9: @MersennePrime(9В этом случае подходящим ответом является возвращение либо пустого списка дополнений,
return Collections.emptyList();либо одного пустого дополнения с полезным сообщением
return Arrays.asList(of("", "No in-range Mersenne primes start with 9"));
- Параметры:
-
element- элемент, к которому применяется аннотация -
annotation- (возможно, частичная) аннотация, применяемая к элементу -
member- член аннотации, для которого нужно вернуть возможные дополнения -
userText- текст исходного кода, который должен быть дополнен - Возвращает:
- предлагаемые дополнения к аннотации
© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.