Интерфейс 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 изначально не повторяется, а затем модифицируется до повторяющегося. Тип содержащей аннотации для 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.
- Since:
- 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)
Значение булевого типа, возвращаемое этим методом, эквивалентно: 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, 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