APIdia Launch Partner
Top Description Methods
java.lang.reflect

public Interface AnnotatedElement

Known Direct Subinterfaces
java.lang.reflect.AnnotatedType, java.lang.reflect.GenericDeclaration, java.lang.reflect.TypeVariable
Known Direct Implementers
java.lang.reflect.Parameter, java.lang.reflect.RecordComponent, java.lang.Class, java.lang.Module, java.lang.Package, java.lang.reflect.AccessibleObject
Imports
java.lang.annotation.Annotation, .AnnotationFormatError, .Repeatable, java.util.Arrays, .LinkedHashMap, .Map, .Objects, java.util.function.Function, java.util.stream.Collectors, sun.reflect.annotation.AnnotationSupport, .AnnotationType

Represents an annotated construct of the program currently running in this VM. A construct is either an element or a type. Annotations on an element are on a declaration, whereas annotations on a type are on a specific use of a type name. As defined by The Java Language Specification section 9.7.4, an annotation on an element is a declaration annotation and an annotation on a type is a type annotation. Note that any annotations returned by methods on the 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:

The table below summarizes which kind of annotation presence different methods in this interface examine.

Overview of kind of presence detected by different AnnotatedElement methods
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>) XX

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.

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.lang.annotation.AnnotationFormatError is thrown.

Finally, attempting to read a member whose definition has evolved incompatibly will result in an java.lang.annotation.AnnotationTypeMismatchException or an java.lang.annotation.IncompleteAnnotationException.

Author
Josh Bloch
Since
1.5
See Also
java.lang.EnumConstantNotPresentException, java.lang.TypeNotPresentException, AnnotationFormatError, java.lang.annotation.AnnotationTypeMismatchException, java.lang.annotation.IncompleteAnnotationException

Method Summary

Modifier and TypeMethod 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 null
getAnnotation
(Class<T>
the 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 element
getAnnotations
()

Returns 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 zero
getAnnotationsByType
(Class<T>
the 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 null
getDeclaredAnnotation
(Class<T>
the 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 element
getDeclaredAnnotations
()

Returns 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 zero
getDeclaredAnnotationsByType
(Class<T>
the 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 false
isAnnotationPresent
(Class<? extends Annotation>
the Class object corresponding to the annotation type
annotationClass
)

Returns true if an annotation for the specified type is present on this element, else false.

Method Detail

getAnnotationback 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.

Parameters
<T>
the type of the annotation to query for and return if present
annotationClass:Class<T>

the Class object corresponding to the annotation type

Returns:T

this element's annotation for the specified annotation type if present on this element, else null

Exceptions
NullPointerException:
if the given annotation class is null
getAnnotationsback 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.

Returns:Annotation[]

annotations present on this element

getAnnotationsByTypeback 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 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.

Implementation Specification

The default implementation first calls getDeclaredAnnotationsByType(Class) passing annotationClass as the argument. If the returned array has length greater than zero, the array is returned. If the returned array is zero-length and this AnnotatedElement is a class and the argument type is an inheritable annotation type, and the superclass of this AnnotatedElement is non-null, then the returned result is the result of calling getAnnotationsByType(Class) on the superclass with annotationClass as the argument. Otherwise, a zero-length array is returned.

Parameters
<T>
the type of the annotation to query for and return if present
annotationClass:Class<T>

the Class object corresponding to the annotation type

Returns:T[]

all this element's annotations for the specified annotation type if associated with this element, else an array of length zero

Exceptions
NullPointerException:
if the given annotation class is null
Since
1.8
getDeclaredAnnotationback 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 returning the first annotation whose annotation type matches the argument type.

Parameters
<T>
the type of the annotation to query for and return if directly present
annotationClass:Class<T>

the Class object corresponding to the annotation type

Returns:T

this element's annotation for the specified annotation type if directly present on this element, else null

Exceptions
NullPointerException:
if the given annotation class is null
Since
1.8
getDeclaredAnnotationsback 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.

Returns:Annotation[]

annotations directly present on this element

getDeclaredAnnotationsByTypeback 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 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.

Implementation Specification

The default implementation may call getDeclaredAnnotation(Class) one or more times to find a directly present annotation and, if the annotation type is repeatable, to find a container annotation. If annotations of the annotation type annotationClass are found to be both directly and indirectly present, then getDeclaredAnnotations() will get called to determine the order of the elements in the returned array.

Alternatively, the default implementation may call getDeclaredAnnotations() a single time and the returned array examined for both directly and indirectly present annotations. The results of calling getDeclaredAnnotations() are assumed to be consistent with the results of calling getDeclaredAnnotation(Class).

Parameters
<T>
the type of the annotation to query for and return if directly or indirectly present
annotationClass:Class<T>

the Class object corresponding to the annotation type

Returns:T[]

all this element's annotations for the specified annotation type if directly or indirectly present on this element, else an array of length zero

Exceptions
NullPointerException:
if the given annotation class is null
Since
1.8
isAnnotationPresentback 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: getAnnotation(annotationClass) != null

Implementation Specification

The default implementation returns getAnnotation(annotationClass) != null.

Parameters
annotationClass:Class<? extends Annotation>

the Class object corresponding to the annotation type

Returns:boolean

true if an annotation for the specified annotation type is present on this element, else false

Exceptions
NullPointerException:
if the given annotation class is null