packages/java.lang.reflect/src/jannotatedelement.ts
Represents an annotated element of the program currently running in this
VM. 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 {@link #getAnnotationsByType(Class)} and {@link#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.
Kind of Presence | |||||
---|---|---|---|---|---|
Method | Directly Present | Indirectly Present | Present | Associated | |
{@code T} | {@link #getAnnotation(Class) getAnnotation(Class<T>)} | X | |||
{@code Annotation[]} | {@link #getAnnotations getAnnotations()} | X | |||
{@code T[]} | {@link #getAnnotationsByType(Class) getAnnotationsByType(Class<T>)} | X | |||
{@code T} | {@link #getDeclaredAnnotation(Class) getDeclaredAnnotation(Class<T>)} | X | |||
{@code Annotation[]} | {@link #getDeclaredAnnotations getDeclaredAnnotations()} | X | |||
{@code T[]} | {@link #getDeclaredAnnotationsByType(Class) getDeclaredAnnotationsByType(Class<T>)} | X | X |
For an invocation of {@code 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 {@link 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 {@link TypeNotPresentException}.
Similarly, attempting to read an enum-valued member will result in
a {@link 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
{@code @Repeatable} annotation whose _value element indicates a type
TC, but TC does not declare a {@code _value()} method
with a return type of T{@code []}, then an exception of type
{@link java.lang.annotation.AnnotationFormatError} is thrown.
Finally, attempting to read a member whose definition has evolved
incompatibly will result in a {@link
java.lang.annotation.AnnotationTypeMismatchException} or an
{@link java.lang.annotation.IncompleteAnnotationException}.
export interface JAnnotatedElement {
/**
* Returns this element's annotation for the specified type if
* such an annotation is <em>present</em>, else null.
*
* @param <T> the type of the annotation to query for and return if present
* @param annotationClass the Class object corresponding to the
* annotation type
* @return this element's annotation for the specified annotation type if
* present on this element, else null
* @throws NullPointerException if the given annotation class is null
* @since 1.5
*/
// getAnnotation(annotationClass: JClass<T>): T;
/**
* Returns annotations that are <em>present</em> on this element.
*
* If there are no annotations <em>present</em> 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.
*
* @return annotations present on this element
* @since 1.5
*/
// getAnnotations(): JArray<JAnnotation>
/**
* Returns annotations that are <em>associated</em> with this element.
*
* If there are no annotations <em>associated</em> with this element, the return
* _value is an array of length 0.
*
* The difference between this method and {@link #getAnnotation(Class)}
* is that this method detects if its argument is a <em>repeatable
* annotation type</em> (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.
*
* @implSpec The default implementation first calls {@link
* #getDeclaredAnnotationsByType(Class)} passing {@code
* 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 {@code AnnotatedElement} is a
* class and the argument type is an inheritable annotation type,
* and the superclass of this {@code AnnotatedElement} is non-null,
* then the returned result is the result of calling {@link
* #getAnnotationsByType(Class)} on the superclass with {@code
* annotationClass} as the argument. Otherwise, a zero-length
* array is returned.
*
* @param <T> the type of the annotation to query for and return if present
* @param annotationClass the Class object corresponding to the
* annotation type
* @return all this element's annotations for the specified annotation type if
* associated with this element, else an array of length zero
* @throws NullPointerException if the given annotation class is null
* @since 1.8
*/
// getAnnotationsByType(annotationClass: JClass<T>): Jarray<T>; // TODO see default implementation?
/**
* Returns this element's annotation for the specified type if
* such an annotation is <em>directly present</em>, else null.
*
* This method ignores inherited annotations. (Returns null if no
* annotations are directly present on this element.)
*
* @implSpec The default implementation first performs a null check
* and then loops over the results of {@link
* #getDeclaredAnnotations} returning the first annotation whose
* annotation type matches the argument type.
*
* @param <T> the type of the annotation to query for and return if directly present
* @param annotationClass the Class object corresponding to the
* annotation type
* @return this element's annotation for the specified annotation type if
* directly present on this element, else null
* @throws NullPointerException if the given annotation class is null
* @since 1.8
*/
// getDeclaredAnnotation(annotationClass: JClass<T>): T; // TODO see default implementation?
/**
* Returns annotations that are <em>directly present</em> on this element.
* This method ignores inherited annotations.
*
* If there are no annotations <em>directly present</em> 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.
*
* @return annotations directly present on this element
* @since 1.5
*/
// getDeclaredAnnotations(): JArray<JAnnotation>;
/**
* Returns this element's annotation(s) for the specified type if
* such annotations are either <em>directly present</em> or
* <em>indirectly present</em>. 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 {@link
* #getDeclaredAnnotation(Class)} is that this method detects if its
* argument is a <em>repeatable annotation type</em> (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.
*
* @implSpec The default implementation may call {@link
* #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 {@code annotationClass} are found to be both
* directly and indirectly present, then {@link
* #getDeclaredAnnotations()} will get called to determine the
* order of the elements in the returned array.
*
* <p>Alternatively, the default implementation may call {@link
* #getDeclaredAnnotations()} a single time and the returned array
* examined for both directly and indirectly present
* annotations. The results of calling {@link
* #getDeclaredAnnotations()} are assumed to be consistent with the
* results of calling {@link #getDeclaredAnnotation(Class)}.
*
* @param <T> the type of the annotation to query for and return
* if directly or indirectly present
* @param annotationClass the Class object corresponding to the
* annotation type
* @return all this element's annotations for the specified annotation type if
* directly or indirectly present on this element, else an array of length zero
* @throws NullPointerException if the given annotation class is null
* @since 1.8
*/
// getDeclaredAnnotationsByType(annotationClass: JClass<T>): Jarray<T>; // TODO see implementation?
}