AnnotatedElement.java 8.5 KB
Newer Older
D
duke 已提交
1
/*
2
 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
D
duke 已提交
3 4 5 6
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
7
 * published by the Free Software Foundation.  Oracle designates this
D
duke 已提交
8
 * particular file as subject to the "Classpath" exception as provided
9
 * by Oracle in the LICENSE file that accompanied this code.
D
duke 已提交
10 11 12 13 14 15 16 17 18 19 20
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
21 22 23
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
D
duke 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37
 */

package java.lang.reflect;

import java.lang.annotation.Annotation;

/**
 * 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.  It is permissible for the caller to modify the
 * arrays returned by accessors for array-valued enum members; it will
 * have no affect on the arrays returned to other callers.
 *
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
 * <p>An annotation A is <em>directly present</em> on an element E if the
 * RuntimeVisibleAnnotations or RuntimeVisibleParameterAnnotations attribute
 * associated with E either:
 * <ul>
 * <li>contains A; or
 * <li>for invocations of get[Declared]Annotations(Class<T>),
 * contains A or exactly one annotation C whose type is the containing
 * annotation type of A's type (JLS 9.6) and whose value element contains A
 * </ul>
 *
 * <p>An annotation A is <em>present</em> on an element E if either:
 * <ul>
 * <li>A is <em>directly present</em> on E; or
 * <li>There are no annotations of A's type which are <em>directly present</em>
 * on E, and E is a class, and A's type is inheritable (JLS 9.6.3.3), and A is
 * present on the superclass of E
 * </ul>
 *
D
duke 已提交
56 57 58 59 60 61 62 63 64 65
 * <p>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}.
 *
 * <p>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.
 *
66 67 68 69 70
 * <p>Attempting to read annotations of a repeatable annotation type T
 * that are contained in an annotation whose type is not, in fact, the
 * containing annotation type of T will result in an
 * InvalidContainerAnnotationError.
 *
71
 * <p>Finally, attempting to read a member whose definition has evolved
D
duke 已提交
72 73 74 75
 * incompatibly will result in a {@link
 * java.lang.annotation.AnnotationTypeMismatchException} or an
 * {@link java.lang.annotation.IncompleteAnnotationException}.
 *
76 77 78 79 80
 * @see java.lang.EnumConstantNotPresentException
 * @see java.lang.TypeNotPresentException
 * @see java.lang.annotation.AnnotationFormatError
 * @see java.lang.annotation.AnnotationTypeMismatchException
 * @see java.lang.annotation.IncompleteAnnotationException
81
 * @see java.lang.annotation.InvalidContainerAnnotationError
D
duke 已提交
82 83 84 85 86 87 88 89 90
 * @since 1.5
 * @author Josh Bloch
 */
public interface AnnotatedElement {
    /**
     * 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.
     *
91 92 93
     * <p>The truth value returned by this method is equivalent to:
     * {@code getAnnotation(annotationClass) != null}
     *
94 95 96
     * <p>The body of the default method is specified to be the code
     * above.
     *
D
duke 已提交
97 98 99 100 101 102 103
     * @param annotationClass the Class object corresponding to the
     *        annotation type
     * @return true if an annotation for the specified annotation
     *     type is present on this element, else false
     * @throws NullPointerException if the given annotation class is null
     * @since 1.5
     */
104 105 106
    default boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
        return getAnnotation(annotationClass) != null;
    }
D
duke 已提交
107 108 109 110 111 112 113 114 115 116 117 118 119 120

   /**
     * Returns this element's annotation for the specified type if
     * such an annotation is present, else null.
     *
     * @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
     */
    <T extends Annotation> T getAnnotation(Class<T> annotationClass);

121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
    /**
     * Returns an array of all this element's annotations for the
     * specified type if one or more of such annotation is present,
     * else an array of length zero.
     *
     * The caller of this method is free to modify the returned array;
     * it will have no effect on the arrays returned to other callers.
     *
     * @param annotationClass the Class object corresponding to the
     *        annotation type
     * @return all this element's annotations for the specified annotation type if
     *     present on this element, else an array of length zero
     * @throws NullPointerException if the given annotation class is null
     * @since 1.8
     */
    <T extends Annotation> T[] getAnnotations(Class<T> annotationClass);

D
duke 已提交
138
    /**
139
     * Returns annotations that are <em>present</em> on this element.
D
duke 已提交
140
     *
141 142 143 144 145 146 147
     * 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
D
duke 已提交
148 149 150 151
     * @since 1.5
     */
    Annotation[] getAnnotations();

152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
    /**
     * Returns this element's annotation for the specified type if
     * such an annotation is present, else null.
     *
     * This method ignores inherited annotations. (Returns null if no
     * annotations are directly present on this element.)
     *
     * @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.8
     */
    <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass);

   /**
     * Returns an array of all this element's annotations for the
     * specified type if one or more of such annotation is directly
     * present, else an array of length zero.
     *
     * This method ignores inherited annotations. (Returns
     * an array of length zero if no annotations are directly present
     * on this element.)  The caller of this method is free to modify
     * the returned array; it will have no effect on the arrays
     * returned to other callers.
     *
     * @param annotationClass the Class object corresponding to the
     *        annotation type
     * @return all this element's annotations for the specified annotation type if
     *     present on this element, else an array of length zero
     * @throws NullPointerException if the given annotation class is null
     * @since 1.8
     */
    <T extends Annotation> T[] getDeclaredAnnotations(Class<T> annotationClass);

D
duke 已提交
188
    /**
189 190 191 192 193 194 195 196
     * 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.
D
duke 已提交
197
     *
198
     * @return annotations directly present on this element
D
duke 已提交
199 200 201 202
     * @since 1.5
     */
    Annotation[] getDeclaredAnnotations();
}