Spec-Zone.ru › OpenJDK 21

Интерфейс AnnotatedElement

Все известные подинтерфейсы:
AnnotatedArrayType, AnnotatedParameterizedType, AnnotatedType, AnnotatedTypeVariable, AnnotatedWildcardType, GenericDeclaration, TypeVariable<D>
Все известные реализующие классы:
AccessibleObject, Class, Constructor, Executable, Field, Method, Module, Package, Parameter, RecordComponent
public interface AnnotatedElement
Представляет аннотированный элемент программы, выполняемой в данной виртуальной машине. Элемент может быть как элементом, так и типом. Аннотации для элемента относятся к объявлению, а аннотации для типа — к определённому использованию имени типа. Как определено в Спецификации языка Java разделе 9.7.4, аннотация на элементе является аннотацией объявления, а аннотация на типе — аннотацией типа. Обратите внимание, что любые аннотации, возвращаемые методами интерфейса AnnotatedType и его подинтерфейсов, являются аннотациями типа, так как потенциально аннотируемым элементом является тип. Аннотации, возвращаемые методами вне иерархии AnnotatedType, являются аннотациями объявления.

Этот интерфейс позволяет отражательно считывать аннотации. Все аннотации, возвращаемые методами в этом интерфейсе, неизменяемы и сериализуемы. Массивы, возвращаемые методами этого интерфейса, могут быть изменены вызывающей стороной без влияния на массивы, возвращаемые другим вызовам.

Методы getAnnotationsByType(Class) и getDeclaredAnnotationsByType(Class) поддерживают несколько аннотаций одного типа на элементе. Если аргументом любого из методов является тип повторяющейся аннотации (JLS 9.6), то метод "смотрит" через контейнерную аннотацию (JLS 9.7), если она есть, и возвращает все аннотации внутри контейнера. Контейнерные аннотации могут генерироваться на этапе компиляции для обертывания нескольких аннотаций требуемого типа.

В данном интерфейсе используются термины прямо присутствующая, косвенно присутствующая, присутствующая и связанная для точного описания возвращаемых методами аннотаций:

  • Аннотация A прямо присутствует на элементе E, если E имеет атрибут RuntimeVisibleAnnotations или RuntimeVisibleParameterAnnotations или RuntimeVisibleTypeAnnotations, и атрибут содержит A.
  • Аннотация A косвенно присутствует на элементе E, если E имеет атрибут RuntimeVisibleAnnotations или RuntimeVisibleParameterAnnotations или RuntimeVisibleTypeAnnotations, тип A является повторяющимся, и атрибут содержит ровно одну аннотацию, значение которой содержит A, а тип — тип содержащей аннотации A.
  • Аннотация A присутствует на элементе E, если выполняется одно из следующих условий:
    • A прямо присутствует на E; или
    • Ни одна аннотация типа A не прямо присутствует на E, и E — класс, а тип A — наследуемый, и A присутствует в суперклассе E.
  • Аннотация A связана с элементом E, если выполняется одно из следующих условий:
    • A прямо или косвенно присутствует на E; или
    • Ни одна аннотация типа A не прямо или косвенно присутствует на E, и E — класс, а тип A — наследуемый, и A связана с суперклассом E.

В таблице ниже подытожены типы присутствия аннотаций, проверяемые различными методами этого интерфейса.

Обзор типов присутствия, определяемых различными методами AnnotatedElement
Метод Тип присутствия
Тип возвращаемого значения Подпись Прямо присутствующая Косвенно присутствующая Присутствующая Связанная
T getAnnotation(Class<T>) X
Annotation[] getAnnotations() X
T[] getAnnotationsByType(Class<T>) X
T getDeclaredAnnotation(Class<T>) X
Annotation[] getDeclaredAnnotations() X
T[] getDeclaredAnnotationsByType(Class<T>) X X

При вызове get[Declared]AnnotationsByType(Class <T>), порядок аннотаций, которые прямо или косвенно присутствуют на элементе E, вычисляется так, как будто косвенно присутствующие аннотации на E прямо присутствуют на E вместо своей контейнерной аннотации, в порядке их появления в элементе значения контейнерной аннотации.

Существует несколько проблем совместимости, которые следует учитывать, если тип аннотации T изначально не повторяется, а затем модифицируется до повторяющегося. Тип содержащей аннотации для T — TC.

  • Модификация T в повторяющуюся аннотацию совместима с исходным и двоичным кодом с существующими случаями использования T и TC. То есть, для совместимости исходного кода исходный код с аннотациями типа T или типа TC всё ещё будет компилироваться. Для двоичной совместимости файлы классов с аннотациями типа T или типа TC (или с другими случаями использования типа T или типа TC) будут подключаться к изменённой версии T, если они подключались к предыдущей версии. (Тип аннотации TC может быть неформально использован как действующий тип содержащей аннотации до того, как T будет формально сделан повторяющимся. Альтернативно, при преобразовании T в повторяющуюся аннотацию TC можно ввести как новый тип.)
  • Если аннотация типа TC присутствует на элементе, а T модифицируется до повторяющейся аннотации с TC в качестве типа содержащей аннотации, то:
    • Изменение T совместимо по поведению с методами get[Declared]Annotation(Class<T>) (вызываемыми с аргументом T или TC) и get[Declared]Annotations() , поскольку результаты методов не изменятся из-за того, что TC стал типом содержащей аннотации для T.
    • Изменение T изменяет результаты методов get[Declared]AnnotationsByType(Class<T>) , вызываемых с аргументом T, потому что эти методы теперь будут распознавать аннотацию типа TC как контейнерную аннотацию для T и будут "просматривать" её, чтобы получить доступ к аннотациям типа T.
  • Если аннотация типа T присутствует на элементе, и T сделана повторяющейся, а аннотации типа T добавлены к элементу:
    • Добавление аннотаций типа T совместимо как с исходным, так и с двоичным кодом.
    • Добавление аннотаций типа T изменяет результаты методов get[Declared]Annotation(Class<T>) и get[Declared]Annotations(), потому что эти методы теперь видят только контейнерную аннотацию на элементе, а не аннотации типа T.
    • Добавление аннотаций типа T изменяет результаты методов get[Declared]AnnotationsByType(Class<T>), потому что их результаты будут отображать дополнительные аннотации типа T, в то время как ранее они отображали только одну аннотацию типа T.

Если аннотация, возвращаемая методом в этом интерфейсе, содержит (прямо или косвенно) член со значением Class, ссылающийся на класс, который недоступен в данной виртуальной машине, попытка прочитать класс, вызвав соответствующий метод Class для возвращаемой аннотации, приведёт к TypeNotPresentException.

Аналогично, попытка прочитать член со значением перечисления приведёт к EnumConstantNotPresentException, если константа перечисления в аннотации больше не присутствует в классе перечисления.

Если тип аннотации T (мета-)аннотирован аннотацией @Repeatable, значение элемента которой указывает на тип TC, но TC не объявляет метод value() с возвращаемым типом T[], то будет выброшено исключение типа AnnotationFormatError.

Наконец, попытка прочитать член, определение которого эволюционировало несовместимо, приведёт к AnnotationTypeMismatchException или IncompleteAnnotationException.

Since:
1.5
См. также:
  • EnumConstantNotPresentException
  • TypeNotPresentException
  • AnnotationFormatError
  • AnnotationTypeMismatchException
  • IncompleteAnnotationException

Краткое описание методов

Модификатор и тип Метод Описание
<T extends Annotation>
T
getAnnotation(Class<T> annotationClass)
Возвращает аннотацию данного элемента для указанного типа, если такая аннотация есть, иначе null.
Annotation[] getAnnotations()
Возвращает аннотации, имеющиеся на данном элементе.
default <T extends Annotation>
T[]
getAnnotationsByType(Class<T> annotationClass)
Возвращает аннотации, связанные с этим элементом.
default <T extends Annotation>
T
getDeclaredAnnotation(Class<T> annotationClass)
Возвращает аннотацию данного элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null.
Annotation[] getDeclaredAnnotations()
Возвращает аннотации, которые непосредственно присутствуют на данном элементе.
default <T extends Annotation>
T[]
getDeclaredAnnotationsByType(Class<T> annotationClass)
Возвращает аннотацию(и) данного элемента для указанного типа, если такая аннотация(и) непосредственно или косвенно присутствует.
default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращает true, если аннотация указанного типа имеется на данном элементе, иначе false.

Подробное описание методов

isAnnotationPresent

default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Возвращает true, если аннотация указанного типа имеется на данном элементе, иначе false. Данный метод предназначен в основном для удобного доступа к аннотациям-маркерам.

Значение булевого типа, возвращаемое этим методом, эквивалентно: getAnnotation(annotationClass) != null

Требования к реализации:
Стандартная реализация возвращает getAnnotation(annotationClass) != null.
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
true, если аннотация указанного типа присутствует на этом элементе, иначе false
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.5

getAnnotation

<T extends Annotation> T getAnnotation(Class<T> annotationClass)
Возвращает аннотацию данного элемента для указанного типа, если такая аннотация имеется, иначе null.
Параметризованные типы:
T - тип аннотации, для которого нужно получить значение и вернуть его, если она есть
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
аннотация данного элемента для указанного типа аннотации, если она присутствует на этом элементе, иначе null
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.5

getAnnotations

Annotation[] getAnnotations()
Возвращает аннотации, имеющиеся на данном элементе. Если на данном элементе нет аннотаций, то возвращаемое значение — массив длины 0. Вызывающий метод может изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.
Возвращает:
аннотации, присутствующие на этом элементе
С тех пор:
1.5

getAnnotationsByType

default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
Возвращает аннотации, связанные с этим элементом. Если на этом элементе нет связанных аннотаций, возвращается массив длины 0. Разница между этим методом и getAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и если да, то пытается найти одну или несколько аннотаций этого типа, "просматривая" контейнерную аннотацию. Вызывающий метод может изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.
Требования к реализации:
Стандартная реализация сначала вызывает getDeclaredAnnotationsByType(Class), передавая annotationClass в качестве аргумента. Если возвращаемый массив имеет длину больше нуля, возвращается массив. Если возвращаемый массив имеет нулевую длину, и этот AnnotatedElement является классом, а тип аргумента — наследуемым типом аннотации, и суперкласс этого AnnotatedElement не равен null, то возвращаемым результатом будет результат вызова getAnnotationsByType(Class) для суперкласса с annotationClass в качестве аргумента. В противном случае возвращается массив нулевой длины.
Параметризованные типы:
T - тип аннотации, для которого нужно получить значение и вернуть его, если она есть
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
все аннотации данного элемента для указанного типа аннотации, если они связаны с этим элементом, иначе массив длины ноль
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.8

getDeclaredAnnotation

default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)
Возвращает аннотацию данного элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. Данный метод игнорирует унаследованные аннотации. (Возвращает null, если на этом элементе нет аннотаций).
Требования к реализации:
Стандартная реализация сначала проверяет на null, а затем перебирает результаты getDeclaredAnnotations(), возвращая первую аннотацию, тип которой соответствует типу аргумента.
Параметризованные типы:
T - тип аннотации, для которого нужно получить значение и вернуть его, если она непосредственно присутствует
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
аннотация данного элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, иначе null
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.8

getDeclaredAnnotationsByType

default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
Возвращает аннотацию(и) данного элемента для указанного типа, если такие аннотации непосредственно или косвенно присутствуют. Данный метод игнорирует унаследованные аннотации. Если на этом элементе нет ни одной аннотации, возвращается массив длины 0. Разница между этим методом и getDeclaredAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и если да, то пытается найти одну или несколько аннотаций этого типа, "просматривая" контейнерную аннотацию, если она присутствует. Вызывающий метод может изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.
Требования к реализации:
Стандартная реализация может вызывать getDeclaredAnnotation(Class) один или несколько раз, чтобы найти непосредственно присутствующую аннотацию и, если тип аннотации повторяется, найти контейнерную аннотацию. Если аннотации указанного типа annotationClass найдены как непосредственно, так и косвенно, то getDeclaredAnnotations() вызывается для определения порядка элементов в возвращаемом массиве.

В качестве альтернативы, стандартная реализация может вызвать getDeclaredAnnotations() один раз, а затем проанализировать возвращаемый массив на предмет непосредственно и косвенно присутствующих аннотаций. Предполагается, что результаты вызова getDeclaredAnnotations() согласуются с результатами вызова getDeclaredAnnotation(Class).

Параметризованные типы:
T - тип аннотации, для которого нужно получить значение и вернуть его, если она непосредственно или косвенно присутствует
Параметры:
annotationClass - объект Class, соответствующий типу аннотации
Возвращает:
все аннотации данного элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, иначе массив длины ноль
Исключения:
NullPointerException - если предоставленный класс аннотации равен null
С тех пор:
1.8

getDeclaredAnnotations

Annotation[] getDeclaredAnnotations()
Возвращает аннотации, которые непосредственно присутствуют на данном элементе. Этот метод игнорирует унаследованные аннотации. Если на данном элементе нет непосредственно присутствующих аннотаций, возвращаемое значение — массив длины 0. Вызывающий метод может изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.
Возвращает:
непосредственно присутствующие на этом элементе аннотации
С тех пор:
1.5

© 1993, 2023, 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.
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/reflect/AnnotatedElement.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API