Spec-Zone.ru › OpenJDK 25

Интерфейс AnnotatedElement

Все известные подинтерфейсы:
AnnotatedArrayType, AnnotatedParameterizedType, AnnotatedType, AnnotatedTypeVariable, AnnotatedWildcardType, GenericDeclaration, TypeVariable<D>
Все известные реализующие классы:
AccessibleObject, Class, Constructor, Executable, Field, Method, Module, Package, Parameter, RecordComponent
public interface AnnotatedElement
Представляет аннотированную конструкцию выполняемой в данный момент программы в этой виртуальной машине. Конструкция — это либо элемент, либо тип. Аннотации элемента относятся к объявлению, тогда как аннотации типа относятся к конкретному использованию имени типа. Согласно разделу 9.7.4 Спецификации языка Java, аннотация элемента является аннотацией объявления, а аннотация типа — аннотацией типа. Обратите внимание, что любые аннотации, возвращаемые методами интерфейса 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 изначально не является повторяемым, а впоследствии становится повторяемым, следует учитывать несколько аспектов совместимости. Контейнерный тип аннотации для T — это TC.

  • Изменение типа T, делающее его повторяемым, совместимо на уровне исходного кода и двоичной совместимости с существующими применениями T и TC. То есть с точки зрения совместимости исходного кода исходный код с аннотациями типа T или TC по-прежнему будет компилироваться. С точки зрения двоичной совместимости файлы классов с аннотациями типа T или TC (либо с другими видами применений типов T или TC) будут связываться с изменённой версией T, если они связывались с предыдущей версией. (До формального объявления T повторяемым тип аннотации TC может неформально выступать в роли контейнерного типа. В качестве альтернативы, когда 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

Требования к реализации:
Реализация по умолчанию возвращает getAnnotation(annotationClass) != null.
Параметры:
annotationClass — объект Class, соответствующий типу аннотации
Возвращает:
true, если аннотация указанного типа присутствует на этом элементе; в противном случае false
Исключения:
NullPointerException — если указанный класс аннотации равен null

getAnnotation

<T extends Annotation> T getAnnotation(Class<T> annotationClass)
Возвращает аннотацию этого элемента для указанного типа, если такая аннотация присутствует; в противном случае возвращает null.
Параметры типа:
T — тип аннотации, наличие которой требуется проверить и которую нужно вернуть, если она присутствует
Параметры:
annotationClass — объект Class, соответствующий типу аннотации
Возвращает:
аннотацию этого элемента для указанного типа аннотации, если она присутствует на этом элементе; в противном случае null
Исключения:
NullPointerException — если указанный класс аннотации равен null

getAnnotations

Annotation[] getAnnotations()
Возвращает аннотации, присутствующие на этом элементе. Если на этом элементе не присутствуют аннотации, возвращаемое значение представляет собой массив длины 0. Вызывающий этот метод может изменить возвращённый массив; это никак не повлияет на массивы, возвращаемые другим вызывающим сторонам.
Возвращает:
аннотации, присутствующие на этом элементе

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. Вызывающий этот метод может изменить возвращённый массив; это никак не повлияет на массивы, возвращаемые другим вызывающим сторонам.
Возвращает:
аннотации, непосредственно присутствующие на этом элементе

Сообщить об ошибке или предложить улучшение
Дополнительную справочную информацию по API и документацию для разработчиков см. в разделе Документация Java SE, содержащем более подробные описания для разработчиков, концептуальные обзоры, определения терминов, обходные решения и работающие примеры кода. Другие версии.
Java является товарным знаком или зарегистрированным товарным знаком Oracle и/или её аффилированных лиц в США и других странах.
Авторские права © 1993, 2025, Oracle и/или её аффилированные лица, 500 Oracle Parkway, Redwood Shores, CA 94065 USA.
Все права защищены. Использование регулируется условиями лицензии и политикой распространения документации.

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

Spec-Zone.ru

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