Интерфейс AnnotatedElement
- Все известные подинтерфейсы:
-
AnnotatedArrayType,AnnotatedParameterizedType,AnnotatedType,AnnotatedTypeVariable,AnnotatedWildcardType,GenericDeclaration,TypeVariable<D>
- Все известные реализующие классы:
-
AccessibleObject,Class,Constructor,Executable,Field,Method,Module,Package,Parameter,RecordComponent
public interface AnnotatedElement
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.
В таблице ниже обобщены типы присутствия аннотаций, проверяемых различными методами этого интерфейса.
| Метод | Тип присутствия | ||||
|---|---|---|---|---|---|
| Тип возврата | Подпись | Прямо присутствует | Косвенно присутствует | Присутствует | Ассоциировано |
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 совместимо с исходным и бинарным кодом.
- Добавление аннотаций типа 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.
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
<T extends Annotation> |
getAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует, в противном случае null. |
Annotation[] |
getAnnotations() |
Возвращает аннотации, которые присутствуют на этом элементе. |
default <T extends Annotation> |
getAnnotationsByType |
Возвращает аннотации, которые связаны с этим элементом. |
default <T extends Annotation> |
getDeclaredAnnotation |
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация непосредственно присутствует, в противном случае null. |
Annotation[] |
getDeclaredAnnotations() |
Возвращает аннотации, которые непосредственно присутствуют на этом элементе. |
default <T extends Annotation> |
getDeclaredAnnotationsByType |
Возвращает аннотацию(и) этого элемента для указанного типа, если такие аннотации непосредственно присутствуют или косвенно присутствуют. |
default boolean |
isAnnotationPresent |
Возвращает true, если аннотация для указанного типа присутствует на этом элементе, иначе false. |
Подробное описание методов
isAnnotationPresent
default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)
Значение true, возвращаемое этим методом, эквивалентно: getAnnotation(annotationClass) != null
- Требования к реализации:
- Стандартная реализация возвращает
getAnnotation(annotationClass) != null. - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращаемое значение:
- true, если аннотация для указанного типа аннотации присутствует на этом элементе, иначе false
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.5
getAnnotation
<T extends Annotation> T getAnnotation(Class<T> annotationClass)
- Параметры типа:
-
T- тип аннотации, для которого выполняется запрос и которая возвращается, если присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращаемое значение:
- аннотация этого элемента для указанного типа аннотации, если она присутствует на этом элементе, в противном случае null
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.5
getAnnotations
Annotation[] getAnnotations()
- Возвращаемое значение:
- аннотации, присутствующие на этом элементе
- С:
- 1.5
getAnnotationsByType
default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
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, а затем перебирает результаты
getDeclaredAnnotations(), возвращая первую аннотацию, тип аннотации которой соответствует типу аргумента. - Параметры типа:
-
T- тип аннотации, для которого выполняется запрос и которая возвращается, если непосредственно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращаемое значение:
- аннотация этого элемента для указанного типа аннотации, если она непосредственно присутствует на этом элементе, в противном случае null
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.8
getDeclaredAnnotationsByType
default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass)
getDeclaredAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяемым типом аннотации (JLS 9.6), и если да, то пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию, если она присутствует. Вызывающий метод может изменять возвращаемый массив; это не повлияет на массивы, возвращаемые другим вызывающим методам.- Требования к реализации:
- Стандартная реализация может вызвать
getDeclaredAnnotation(Class)один или несколько раз для поиска непосредственно присутствующей аннотации и, если тип аннотации повторяемый, для поиска контейнерной аннотации. Если аннотации типаannotationClassобнаружены как непосредственно, так и косвенно присутствующие, тоgetDeclaredAnnotations()будет вызван для определения порядка элементов в возвращаемом массиве.В качестве альтернативы, стандартная реализация может вызвать
getDeclaredAnnotations()один раз, и возвращаемый массив будет проверен на наличие как непосредственно, так и косвенно присутствующих аннотаций. Результаты вызоваgetDeclaredAnnotations()предполагаются согласованными с результатами вызоваgetDeclaredAnnotation(Class). - Параметры типа:
-
T- тип аннотации, для которого выполняется запрос и которая возвращается, если непосредственно или косвенно присутствует - Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращаемое значение:
- все аннотации этого элемента для указанного типа аннотации, если они непосредственно или косвенно присутствуют на этом элементе, иначе массив длиной ноль
- Исключения:
-
NullPointerException- если заданный класс аннотации равен null - С:
- 1.8
getDeclaredAnnotations
Annotation[] getDeclaredAnnotations()
- Возвращаемое значение:
- аннотации, непосредственно присутствующие на этом элементе
- С:
- 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