Интерфейс 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; или
- Ни одна аннотация типа 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 изначально не повторяем, а затем изменяется на повторяемый. Типом содержащей аннотации является 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.
- С:
- 1.5
- См. также:
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
<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
getAnnotation
<T extends Annotation> T getAnnotation(Class<T> annotationClass)
- Параметры типа:
T- тип аннотации, для которого выполняется поиск и возвращается, если присутствует- Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- аннотация данного элемента для указанного типа аннотации, если она присутствует на данном элементе, иначе null
- Исключение:
-
NullPointerException- если переданный класс аннотации равен null
getAnnotations
Annotation[] getAnnotations()
- Возвращает:
- аннотации, присутствующие на данном элементе
getAnnotationsByType
default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass)
getAnnotation(Class) заключается в том, что этот метод определяет, является ли его аргумент повторяющимся типом аннотации (JLS 9.6), и если да, то пытается найти одну или несколько аннотаций этого типа, «просматривая» контейнерную аннотацию. Вызывающий метод свободен изменять возвращённый массив; это не повлияет на массивы, возвращённые другим вызывающим сторонам.- Требования к реализации:
- Реализация по умолчанию сначала вызывает
getDeclaredAnnotationsByType(Class), передаваяannotationClassв качестве аргумента. Если возвращаемый массив имеет длину больше нуля, то возвращается этот массив. Если возвращаемый массив имеет длину 0 и данныйAnnotatedElementявляется классом, а тип аргумента — наследуемым типом аннотации, и суперкласс данногоAnnotatedElementне равен null, то возвращаемое значение — результат вызоваgetAnnotationsByType(Class)для суперкласса сannotationClassв качестве аргумента. В противном случае возвращается массив нулевой длины. - Параметры типа:
T- тип аннотации, для которого выполняется поиск и возвращается, если присутствует- Параметры:
-
annotationClass- объект Class, соответствующий типу аннотации - Возвращает:
- все аннотации данного элемента для указанного типа аннотации, если они ассоциированы с этим элементом, иначе массив длиной 0
- Исключение:
-
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, соответствующий типу аннотации - Возвращает:
- все аннотации данного элемента для указанного типа аннотации, если они присутствуют непосредственно или косвенно на этом элементе, иначе массив длиной 0
- Исключение:
-
NullPointerException- если переданный класс аннотации равен null - С:
- 1.8
getDeclaredAnnotations
Annotation[] getDeclaredAnnotations()
- Возвращает:
- аннотации, непосредственно присутствующие на данном элементе
© 1993, 2025, 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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/reflect/AnnotatedElement.html