public interface AnnotatedElement
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.
| Kind of Presence | |||||
|---|---|---|---|---|---|
| Method | 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 type.
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 AnnotationFormatError is thrown.
Finally, attempting to read a member whose definition has evolved incompatibly will result in a AnnotationTypeMismatchException or an IncompleteAnnotationException.
| Modifier and Type | Method and Description |
|---|---|
<T extends Annotation |
getAnnotation(Class
Returns this element's annotation for the specified type if such an annotation is
present, else null.
|
Annotation |
getAnnotations()
Returns annotations that are
present on this element.
|
default <T extends Annotation |
getAnnotationsByType(Class
Returns annotations that are
associated with this element.
|
default <T extends Annotation |
getDeclaredAnnotation(Class
Returns this element's annotation for the specified type if such an annotation is
directly present, else null.
|
Annotation |
getDeclaredAnnotations()
Returns annotations that are
directly present on this element.
|
default <T extends Annotation |
getDeclaredAnnotationsByType(Class
Returns this element's annotation(s) for the specified type if such annotations are either
directly present or
indirectly present.
|
default boolean |
isAnnotationPresent(Class
Returns true if an annotation for the specified type is
present on this element, else false.
|
default boolean isAnnotationPresent(Class<? extends Annotation > annotationClass)
The truth value returned by this method is equivalent to: getAnnotation(annotationClass) != null
The body of the default method is specified to be the code above.
annotationClass - the Class object corresponding to the annotation type
NullPointerException - if the given annotation class is null
<T extends Annotation> T getAnnotation(Class <T> annotationClass)
T - the type of the annotation to query for and return if present
annotationClass - the Class object corresponding to the annotation type
NullPointerException - if the given annotation class is null
Annotation[] getAnnotations()
default <T extends Annotation> T[] getAnnotationsByType(Class <T> annotationClass)
getAnnotation(Class) is that this method detects if its argument is a
repeatable annotation type (JLS 9.6), and if so, attempts to find one or more annotations of that type by "looking through" a container annotation. The caller of this method is free to modify the returned array; it will have no effect on the arrays returned to other callers.
T - the type of the annotation to query for and return if present
annotationClass - the Class object corresponding to the annotation type
NullPointerException - if the given annotation class is null
default <T extends Annotation> T getDeclaredAnnotation(Class <T> annotationClass)
T - the type of the annotation to query for and return if directly present
annotationClass - the Class object corresponding to the annotation type
NullPointerException - if the given annotation class is null
default <T extends Annotation> T[] getDeclaredAnnotationsByType(Class <T> annotationClass)
getDeclaredAnnotation(Class) is that this method detects if its argument is a
repeatable annotation type (JLS 9.6), and if so, attempts to find one or more annotations of that type by "looking through" a container annotation if one is present. The caller of this method is free to modify the returned array; it will have no effect on the arrays returned to other callers.
T - the type of the annotation to query for and return if directly or indirectly present
annotationClass - the Class object corresponding to the annotation type
NullPointerException - if the given annotation class is null
Annotation[] getDeclaredAnnotations()