Интерфейс AnnotatedElement

Все известные подинтерфейсы:
AnnotatedArrayType, AnnotatedParameterizedType, AnnotatedType, AnnotatedTypeVariable, AnnotatedWildcardType, GenericDeclaration, TypeVariable<D>
Все известные реализующие классы:
AccessibleObject, Class, Constructor, Executable, Field, Method, Module, Package, Parameter
public interface AnnotatedElement

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

Методы 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.

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

Метод Тип присутствия
Тип возвращаемого значения Подпись Непосредственно присутствующий Косвенно присутствующий Присутствующий Ассоциированный
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.

С:
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

Тело метода по умолчанию указано в коде выше.

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

getAnnotation

<T extends Annotation> T getAnnotation(Class<T> annotationClass)

Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, иначе null.

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

getDeclaredAnnotation

default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)

Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, иначе null. Этот метод игнорирует унаследованные аннотации. (Возвращает null, если на этом элементе нет непосредственно присутствующих аннотаций.)

Требования к реализации:
В реализации по умолчанию сначала выполняется проверка на null, а затем цикл по результатам getDeclaredAnnotations(), возвращающий первую аннотацию, тип аннотации которой совпадает с типом аргумента.
Параметры типа:
T - тип аннотации, для которого выполняется запрос, и которая возвращается, если она непосредственно присутствует
Параметры:
annotationClass - объект класса, соответствующий типу аннотации
Возвращает:
аннотацию этого элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, иначе 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 - объект класса, соответствующий типу аннотации
Возвращает:
все аннотации этого элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, иначе массив длиной ноль
Исключение:
NullPointerException - если переданный класс аннотации равен null
С:
1.8

getDeclaredAnnotations

Annotation[] getDeclaredAnnotations()

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

Возвращает:
непосредственно присутствующие на этом элементе аннотации
С:
1.5

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

Spec-Zone .ru
спецификации, руководства, описания, API