src/share/classes/javax/lang/model/element/Element.java

Wed, 13 Feb 2013 10:33:13 +0100

author
jfranck
date
Wed, 13 Feb 2013 10:33:13 +0100
changeset 1564
aeadaf905d78
parent 1494
f805b5e3c9d1
child 1645
97f6839673d6
permissions
-rw-r--r--

8007279: Rename javax.l.model.element.Element.getAnnotations(Class) to getAnnotationsByType(Class)
Reviewed-by: darcy, abuckley

     1 /*
     2  * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    26 package javax.lang.model.element;
    29 import java.lang.annotation.Annotation;
    30 import java.lang.annotation.AnnotationTypeMismatchException;
    31 import java.lang.annotation.IncompleteAnnotationException;
    32 import java.util.List;
    33 import java.util.Set;
    35 import javax.lang.model.type.*;
    36 import javax.lang.model.util.*;
    39 /**
    40  * Represents a program element such as a package, class, or method.
    41  * Each element represents a static, language-level construct
    42  * (and not, for example, a runtime construct of the virtual machine).
    43  *
    44  * <p> Elements should be compared using the {@link #equals(Object)}
    45  * method.  There is no guarantee that any particular element will
    46  * always be represented by the same object.
    47  *
    48  * <p> To implement operations based on the class of an {@code
    49  * Element} object, either use a {@linkplain ElementVisitor visitor} or
    50  * use the result of the {@link #getKind} method.  Using {@code
    51  * instanceof} is <em>not</em> necessarily a reliable idiom for
    52  * determining the effective class of an object in this modeling
    53  * hierarchy since an implementation may choose to have a single object
    54  * implement multiple {@code Element} subinterfaces.
    55  *
    56  * @author Joseph D. Darcy
    57  * @author Scott Seligman
    58  * @author Peter von der Ah&eacute;
    59  * @see Elements
    60  * @see TypeMirror
    61  * @since 1.6
    62  */
    63 public interface Element {
    65     /**
    66      * Returns the type defined by this element.
    67      *
    68      * <p> A generic element defines a family of types, not just one.
    69      * If this is a generic element, a <i>prototypical</i> type is
    70      * returned.  This is the element's invocation on the
    71      * type variables corresponding to its own formal type parameters.
    72      * For example,
    73      * for the generic class element {@code C<N extends Number>},
    74      * the parameterized type {@code C<N>} is returned.
    75      * The {@link Types} utility interface has more general methods
    76      * for obtaining the full range of types defined by an element.
    77      *
    78      * @see Types
    79      *
    80      * @return the type defined by this element
    81      */
    82     TypeMirror asType();
    84     /**
    85      * Returns the {@code kind} of this element.
    86      *
    87      * @return the kind of this element
    88      */
    89     ElementKind getKind();
    91     /**
    92      * Returns the annotations that are directly present on this element.
    93      *
    94      * <p> To get inherited annotations as well, use
    95      * {@link Elements#getAllAnnotationMirrors(Element) getAllAnnotationMirrors}.
    96      *
    97      * @see ElementFilter
    98      *
    99      * @return the annotations directly present on this element;
   100      *          an empty list if there are none
   101      */
   102     List<? extends AnnotationMirror> getAnnotationMirrors();
   104     /**
   105      * Returns this element's annotation for the specified type if
   106      * such an annotation is present, else {@code null}.  The
   107      * annotation may be either inherited or directly present on this
   108      * element.
   109      *
   110      * <p> The annotation returned by this method could contain an element
   111      * whose value is of type {@code Class}.
   112      * This value cannot be returned directly:  information necessary to
   113      * locate and load a class (such as the class loader to use) is
   114      * not available, and the class might not be loadable at all.
   115      * Attempting to read a {@code Class} object by invoking the relevant
   116      * method on the returned annotation
   117      * will result in a {@link MirroredTypeException},
   118      * from which the corresponding {@link TypeMirror} may be extracted.
   119      * Similarly, attempting to read a {@code Class[]}-valued element
   120      * will result in a {@link MirroredTypesException}.
   121      *
   122      * <blockquote>
   123      * <i>Note:</i> This method is unlike others in this and related
   124      * interfaces.  It operates on runtime reflective information &mdash;
   125      * representations of annotation types currently loaded into the
   126      * VM &mdash; rather than on the representations defined by and used
   127      * throughout these interfaces.  Consequently, calling methods on
   128      * the returned annotation object can throw many of the exceptions
   129      * that can be thrown when calling methods on an annotation object
   130      * returned by core reflection.  This method is intended for
   131      * callers that are written to operate on a known, fixed set of
   132      * annotation types.
   133      * </blockquote>
   134      *
   135      * @param <A>  the annotation type
   136      * @param annotationType  the {@code Class} object corresponding to
   137      *          the annotation type
   138      * @return this element's annotation for the specified annotation
   139      *         type if present on this element, else {@code null}
   140      *
   141      * @see #getAnnotationMirrors()
   142      * @see java.lang.reflect.AnnotatedElement#getAnnotation
   143      * @see EnumConstantNotPresentException
   144      * @see AnnotationTypeMismatchException
   145      * @see IncompleteAnnotationException
   146      * @see MirroredTypeException
   147      * @see MirroredTypesException
   148      */
   149     <A extends Annotation> A getAnnotation(Class<A> annotationType);
   151     /**
   152      * Returns annotations that are <em>present</em> on this element.
   153      *
   154      * If there are no annotations <em>present</em> on this element, the return
   155      * value is an array of length 0.
   156      *
   157      * The difference between this method and {@link #getAnnotation(Class)}
   158      * is that this method detects if its argument is a <em>repeatable
   159      * annotation type</em> (JLS 9.6), and if so, attempts to find one or more
   160      * annotations of that type by "looking through" a container annotation.
   161      *
   162      * <p> The annotations returned by this method could contain an element
   163      * whose value is of type {@code Class}.
   164      * This value cannot be returned directly:  information necessary to
   165      * locate and load a class (such as the class loader to use) is
   166      * not available, and the class might not be loadable at all.
   167      * Attempting to read a {@code Class} object by invoking the relevant
   168      * method on the returned annotation
   169      * will result in a {@link MirroredTypeException},
   170      * from which the corresponding {@link TypeMirror} may be extracted.
   171      * Similarly, attempting to read a {@code Class[]}-valued element
   172      * will result in a {@link MirroredTypesException}.
   173      *
   174      * <blockquote>
   175      * <i>Note:</i> This method is unlike others in this and related
   176      * interfaces.  It operates on runtime reflective information &mdash;
   177      * representations of annotation types currently loaded into the
   178      * VM &mdash; rather than on the representations defined by and used
   179      * throughout these interfaces.  Consequently, calling methods on
   180      * the returned annotation object can throw many of the exceptions
   181      * that can be thrown when calling methods on an annotation object
   182      * returned by core reflection.  This method is intended for
   183      * callers that are written to operate on a known, fixed set of
   184      * annotation types.
   185      * </blockquote>
   186      *
   187      * @param <A>  the annotation type
   188      * @param annotationType  the {@code Class} object corresponding to
   189      *          the annotation type
   190      * @return this element's annotations for the specified annotation
   191      *         type if present on this element, else an empty array
   192      *
   193      * @see #getAnnotationMirrors()
   194      * @see #getAnnotation(java.lang.Class)
   195      * @see java.lang.reflect.AnnotatedElement#getAnnotationsByType
   196      * @see EnumConstantNotPresentException
   197      * @see AnnotationTypeMismatchException
   198      * @see IncompleteAnnotationException
   199      * @see MirroredTypeException
   200      * @see MirroredTypesException
   201      */
   202     <A extends Annotation> A[] getAnnotationsByType(Class<A> annotationType);
   204     /**
   205      * Returns the modifiers of this element, excluding annotations.
   206      * Implicit modifiers, such as the {@code public} and {@code static}
   207      * modifiers of interface members, are included.
   208      *
   209      * @return the modifiers of this element, or an empty set if there are none
   210      */
   211     Set<Modifier> getModifiers();
   213     /**
   214      * Returns the simple (unqualified) name of this element.  The
   215      * name of a generic type does not include any reference to its
   216      * formal type parameters.
   217      *
   218      * For example, the simple name of the type element {@code
   219      * java.util.Set<E>} is {@code "Set"}.
   220      *
   221      * If this element represents an unnamed {@linkplain
   222      * PackageElement#getSimpleName package}, an empty name is
   223      * returned.
   224      *
   225      * If it represents a {@linkplain ExecutableElement#getSimpleName
   226      * constructor}, the name "{@code <init>}" is returned.  If it
   227      * represents a {@linkplain ExecutableElement#getSimpleName static
   228      * initializer}, the name "{@code <clinit>}" is returned.
   229      *
   230      * If it represents an {@linkplain TypeElement#getSimpleName
   231      * anonymous class} or {@linkplain ExecutableElement#getSimpleName
   232      * instance initializer}, an empty name is returned.
   233      *
   234      * @return the simple name of this element
   235      * @see PackageElement#getSimpleName
   236      * @see ExecutableElement#getSimpleName
   237      * @see TypeElement#getSimpleName
   238      * @see VariableElement#getSimpleName
   239      */
   240     Name getSimpleName();
   242     /**
   243      * Returns the innermost element
   244      * within which this element is, loosely speaking, enclosed.
   245      * <ul>
   246      * <li> If this element is one whose declaration is lexically enclosed
   247      * immediately within the declaration of another element, that other
   248      * element is returned.
   249      *
   250      * <li> If this is a {@linkplain TypeElement#getEnclosingElement
   251      * top-level type}, its package is returned.
   252      *
   253      * <li> If this is a {@linkplain
   254      * PackageElement#getEnclosingElement package}, {@code null} is
   255      * returned.
   256      *
   257      * <li> If this is a {@linkplain
   258      * TypeParameterElement#getEnclosingElement type parameter},
   259      * {@linkplain TypeParameterElement#getGenericElement the
   260      * generic element} of the type parameter is returned.
   261      *
   262      * <li> If this is a {@linkplain
   263      * VariableElement#getEnclosingElement method or constructor
   264      * parameter}, {@linkplain ExecutableElement the executable
   265      * element} which declares the parameter is returned.
   266      *
   267      * </ul>
   268      *
   269      * @return the enclosing element, or {@code null} if there is none
   270      * @see Elements#getPackageOf
   271      */
   272     Element getEnclosingElement();
   274     /**
   275      * Returns the elements that are, loosely speaking, directly
   276      * enclosed by this element.
   277      *
   278      * A {@linkplain TypeElement#getEnclosedElements class or
   279      * interface} is considered to enclose the fields, methods,
   280      * constructors, and member types that it directly declares.
   281      *
   282      * A {@linkplain PackageElement#getEnclosedElements package}
   283      * encloses the top-level classes and interfaces within it, but is
   284      * not considered to enclose subpackages.
   285      *
   286      * Other kinds of elements are not currently considered to enclose
   287      * any elements; however, that may change as this API or the
   288      * programming language evolves.
   289      *
   290      * <p>Note that elements of certain kinds can be isolated using
   291      * methods in {@link ElementFilter}.
   292      *
   293      * @return the enclosed elements, or an empty list if none
   294      * @see PackageElement#getEnclosedElements
   295      * @see TypeElement#getEnclosedElements
   296      * @see Elements#getAllMembers
   297      * @jls 8.8.9 Default Constructor
   298      * @jls 8.9 Enums
   299      */
   300     List<? extends Element> getEnclosedElements();
   302     /**
   303      * Returns {@code true} if the argument represents the same
   304      * element as {@code this}, or {@code false} otherwise.
   305      *
   306      * <p>Note that the identity of an element involves implicit state
   307      * not directly accessible from the element's methods, including
   308      * state about the presence of unrelated types.  Element objects
   309      * created by different implementations of these interfaces should
   310      * <i>not</i> be expected to be equal even if &quot;the same&quot;
   311      * element is being modeled; this is analogous to the inequality
   312      * of {@code Class} objects for the same class file loaded through
   313      * different class loaders.
   314      *
   315      * @param obj  the object to be compared with this element
   316      * @return {@code true} if the specified object represents the same
   317      *          element as this
   318      */
   319     boolean equals(Object obj);
   321     /**
   322      * Obeys the general contract of {@link Object#hashCode Object.hashCode}.
   323      *
   324      * @see #equals
   325      */
   326     int hashCode();
   328     /**
   329      * Applies a visitor to this element.
   330      *
   331      * @param <R> the return type of the visitor's methods
   332      * @param <P> the type of the additional parameter to the visitor's methods
   333      * @param v   the visitor operating on this element
   334      * @param p   additional parameter to the visitor
   335      * @return a visitor-specified result
   336      */
   337     <R, P> R accept(ElementVisitor<R, P> v, P p);
   338 }

mercurial