Spec-Zone.ru › OpenJDK 17

Интерфейс 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; или
    • Прямо на E нет аннотации типа A, E — класс, тип A — наследуемый, и A присутствует в суперклассе E.
  • Аннотация A ассоциирована с элементом E, если выполняется одно из условий:
    • A прямо или косвенно присутствует на E; или
    • Прямо или косвенно на E нет аннотации типа A, 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 изначально не является повторяемым, а затем модифицируется в повторяемый. Тип содержащей аннотации — 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. Этот метод предназначен в первую очередь для удобного доступа к аннотациям-меткам.

Значение true, возвращаемое этим методом, эквивалентно: 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, 2021, 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/17/docs/api/java.base/java/lang/reflect/AnnotatedElement.html

Spec-Zone.ru

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