AnnotatedType interface and its subinterfaces are
type annotations as the entity being potentially annotated is a
type. Annotations returned by methods outside of the AnnotatedType hierarchy are declaration annotations.
This interface allows annotations to be read reflectively. All annotations returned by methods in this interface are immutable and serializable. The arrays returned by methods of this interface may be modified by callers without affecting the arrays returned to other callers.
The getAnnotationsByType(Class) and getDeclaredAnnotationsByType(Class) methods support multiple
annotations of the same type on an element. If the argument to
either method is a repeatable annotation type (JLS 9.6),
then the method will "look through" a container annotation (JLS
9.7), if present, and return any annotations inside the
container. Container annotations may be generated at compile-time
to wrap multiple annotations of the argument type.
The terms directly present, indirectly present, present, and associated are used throughout this interface to describe precisely which annotations are returned by methods:
RuntimeVisibleAnnotations or RuntimeVisibleParameterAnnotations or RuntimeVisibleTypeAnnotations attribute, and the attribute
contains A.
RuntimeVisibleAnnotations or
RuntimeVisibleParameterAnnotations or RuntimeVisibleTypeAnnotations
attribute, and A 's type is repeatable, and the attribute contains
exactly one annotation whose value element contains A and whose
type is the containing annotation type of A 's type.
The table below summarizes which kind of annotation presence different methods in this interface examine.
| Method | Kind of Presence | ||||
|---|---|---|---|---|---|
| Return Type | Signature | Directly Present | Indirectly Present | Present | Associated |
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 | ||
For an invocation of get[Declared]AnnotationsByType(Class <T>),
the order of annotations which are directly or indirectly
present on an element E is computed as if indirectly present
annotations on E are directly present on E in place
of their container annotation, in the order in which they appear in
the value element of the container annotation.
There are several compatibility concerns to keep in mind if an annotation type T is originally not repeatable and later modified to be repeatable. The containing annotation type for T is TC.
get[Declared]Annotation(Class<T>) (called with an
argument of T or TC) and get[Declared]Annotations() methods because the results of the
methods will not change due to TC becoming the containing
annotation type for T.
get[Declared]AnnotationsByType(Class<T>) methods called with an
argument of T, because those methods will now recognize an
annotation of type TC as a container annotation for T
and will "look through" it to expose annotations of type T.
get[Declared]Annotation(Class<T>) methods and get[Declared]Annotations() methods, because those methods will now
only see a container annotation on the element and not see an
annotation of type T.
get[Declared]AnnotationsByType(Class<T>)
methods, because their results will expose the additional
annotations of type T whereas previously they exposed only a
single annotation of type T.
If an annotation returned by a method in this interface contains
(directly or indirectly) a Class-valued member referring to
a class that is not accessible in this VM, attempting to read the class
by calling the relevant Class-returning method on the returned annotation
will result in a TypeNotPresentException.
Similarly, attempting to read an enum-valued member will result in
a EnumConstantNotPresentException if the enum constant in the
annotation is no longer present in the enum class.
If an annotation type T is (meta-)annotated with an
@Repeatable annotation whose value element indicates a type
TC, but TC does not declare a value() method
with a return type of T[], then an exception of type
java. is thrown.
Finally, attempting to read a member whose definition has evolved
incompatibly will result in an java. or an
java..
java.lang.EnumConstantNotPresentException , java.lang.TypeNotPresentException , AnnotationFormatError, java.lang.annotation.AnnotationTypeMismatchException , java.lang.annotation.IncompleteAnnotationException
| Modifier and Type | Method and Description |
|---|---|
| public < the type of the annotation to query for and return if present T extends Annotation> T | Returns: this element's annotation for the specified annotation type if present on this element, else nullthe Class object corresponding to the
annotation type annotationClass)Returns this element's annotation for the specified type if such an annotation is present, else null. |
| public Annotation[] | Returns: annotations present on this elementReturns annotations that are present on this element. |
| public default < the type of the annotation to query for and return if present T extends Annotation> T[] | Returns: all this element's annotations for the specified annotation type if associated with this element, else an array of length zerothe Class object corresponding to the
annotation type annotationClass)Returns annotations that are associated with this element. |
| public default < the type of the annotation to query for and return if directly present T extends Annotation> T | Returns: this element's annotation for the specified annotation type if directly present on this element, else nullthe Class object corresponding to the
annotation type annotationClass)Returns this element's annotation for the specified type if such an annotation is directly present, else null. |
| public Annotation[] | Returns: annotations directly present on this elementReturns annotations that are directly present on this element. |
| public default < the type of the annotation to query for and return
if directly or indirectly present T extends Annotation> T[] | Returns: all this element's annotations for the specified annotation type if directly or indirectly present on this element, else an array of length zerothe Class object corresponding to the
annotation type annotationClass)Returns this element's annotation(s) for the specified type if such annotations are either directly present or indirectly present. |
| public default boolean | Returns: true if an annotation for the specified annotation type is present on this element, else falsethe Class object corresponding to the
annotation type annotationClass)Returns true if an annotation for the specified type is present on this element, else false. |
| getAnnotation | back to summary |
|---|---|
| public <T extends Annotation> T getAnnotation(Class<T> annotationClass) Returns this element's annotation for the specified type if such an annotation is present, else null.
| |
| getAnnotations | back to summary |
|---|---|
| public Annotation[] getAnnotations() Returns annotations that are present on this element. If there are no annotations present on this element, the return value is an array of length 0. The caller of this method is free to modify the returned array; it will have no effect on the arrays returned to other callers.
| |
| getAnnotationsByType | back to summary |
|---|---|
| public default <T extends Annotation> T[] getAnnotationsByType(Class<T> annotationClass) Returns annotations that are associated with this element.
If there are no annotations associated with this element, the return
value is an array of length 0.
The difference between this method and Implementation Specification The default implementation first calls
| |
| getDeclaredAnnotation | back to summary |
|---|---|
| public default <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass) Returns this element's annotation for the specified type if such an annotation is directly present, else null. This method ignores inherited annotations. (Returns null if no annotations are directly present on this element.) Implementation Specification The default implementation first performs a null check
and then loops over the results of
| |
| getDeclaredAnnotations | back to summary |
|---|---|
| public Annotation[] getDeclaredAnnotations() Returns annotations that are directly present on this element. This method ignores inherited annotations. If there are no annotations directly present on this element, the return value is an array of length 0. The caller of this method is free to modify the returned array; it will have no effect on the arrays returned to other callers.
| |
| getDeclaredAnnotationsByType | back to summary |
|---|---|
| public default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class<T> annotationClass) Returns this element's annotation(s) for the specified type if
such annotations are either directly present or
indirectly present. This method ignores inherited
annotations.
If there are no specified annotations directly or indirectly
present on this element, the return value is an array of length
0.
The difference between this method and Implementation Specification The default implementation may call Alternatively, the default implementation may call
| |
| isAnnotationPresent | back to summary |
|---|---|
| public default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) Returns true if an annotation for the specified type is present on this element, else false. This method is designed primarily for convenient access to marker annotations. The truth value returned by this method is equivalent to:
Implementation Specification The default implementation returns
| |