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

Tue, 09 Oct 2012 19:10:00 -0700

author
jjg
date
Tue, 09 Oct 2012 19:10:00 -0700
changeset 1357
c75be5bc5283
parent 1181
cf2496340fef
child 1484
7612fe48be90
permissions
-rw-r--r--

8000663: clean up langtools imports
Reviewed-by: darcy

     1 /*
     2  * Copyright (c) 2005, 2012, 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 the modifiers of this element, excluding annotations.
   153      * Implicit modifiers, such as the {@code public} and {@code static}
   154      * modifiers of interface members, are included.
   155      *
   156      * @return the modifiers of this element, or an empty set if there are none
   157      */
   158     Set<Modifier> getModifiers();
   160     /**
   161      * Returns the simple (unqualified) name of this element.  The
   162      * name of a generic type does not include any reference to its
   163      * formal type parameters.
   164      *
   165      * For example, the simple name of the type element {@code
   166      * java.util.Set<E>} is {@code "Set"}.
   167      *
   168      * If this element represents an unnamed {@linkplain
   169      * PackageElement#getSimpleName package}, an empty name is
   170      * returned.
   171      *
   172      * If it represents a {@linkplain ExecutableElement#getSimpleName
   173      * constructor}, the name "{@code <init>}" is returned.  If it
   174      * represents a {@linkplain ExecutableElement#getSimpleName static
   175      * initializer}, the name "{@code <clinit>}" is returned.
   176      *
   177      * If it represents an {@linkplain TypeElement#getSimpleName
   178      * anonymous class} or {@linkplain ExecutableElement#getSimpleName
   179      * instance initializer}, an empty name is returned.
   180      *
   181      * @return the simple name of this element
   182      */
   183     Name getSimpleName();
   185     /**
   186      * Returns the innermost element
   187      * within which this element is, loosely speaking, enclosed.
   188      * <ul>
   189      * <li> If this element is one whose declaration is lexically enclosed
   190      * immediately within the declaration of another element, that other
   191      * element is returned.
   192      *
   193      * <li> If this is a {@linkplain TypeElement#getEnclosingElement
   194      * top-level type}, its package is returned.
   195      *
   196      * <li> If this is a {@linkplain
   197      * PackageElement#getEnclosingElement package}, {@code null} is
   198      * returned.
   199      *
   200      * <li> If this is a {@linkplain
   201      * TypeParameterElement#getEnclosingElement type parameter},
   202      * {@linkplain TypeParameterElement#getGenericElement the
   203      * generic element} of the type parameter is returned.
   204      *
   205      * </ul>
   206      *
   207      * @return the enclosing element, or {@code null} if there is none
   208      * @see Elements#getPackageOf
   209      */
   210     Element getEnclosingElement();
   212     /**
   213      * Returns the elements that are, loosely speaking, directly
   214      * enclosed by this element.
   215      *
   216      * A {@linkplain TypeElement#getEnclosedElements class or
   217      * interface} is considered to enclose the fields, methods,
   218      * constructors, and member types that it directly declares.
   219      *
   220      * A {@linkplain PackageElement#getEnclosedElements package}
   221      * encloses the top-level classes and interfaces within it, but is
   222      * not considered to enclose subpackages.
   223      *
   224      * Other kinds of elements are not currently considered to enclose
   225      * any elements; however, that may change as this API or the
   226      * programming language evolves.
   227      *
   228      * <p>Note that elements of certain kinds can be isolated using
   229      * methods in {@link ElementFilter}.
   230      *
   231      * @return the enclosed elements, or an empty list if none
   232      * @see PackageElement#getEnclosedElements
   233      * @see TypeElement#getEnclosedElements
   234      * @see Elements#getAllMembers
   235      * @jls 8.8.9 Default Constructor
   236      * @jls 8.9 Enums
   237      */
   238     List<? extends Element> getEnclosedElements();
   240     /**
   241      * Returns {@code true} if the argument represents the same
   242      * element as {@code this}, or {@code false} otherwise.
   243      *
   244      * <p>Note that the identity of an element involves implicit state
   245      * not directly accessible from the element's methods, including
   246      * state about the presence of unrelated types.  Element objects
   247      * created by different implementations of these interfaces should
   248      * <i>not</i> be expected to be equal even if &quot;the same&quot;
   249      * element is being modeled; this is analogous to the inequality
   250      * of {@code Class} objects for the same class file loaded through
   251      * different class loaders.
   252      *
   253      * @param obj  the object to be compared with this element
   254      * @return {@code true} if the specified object represents the same
   255      *          element as this
   256      */
   257     boolean equals(Object obj);
   259     /**
   260      * Obeys the general contract of {@link Object#hashCode Object.hashCode}.
   261      *
   262      * @see #equals
   263      */
   264     int hashCode();
   266     /**
   267      * Applies a visitor to this element.
   268      *
   269      * @param <R> the return type of the visitor's methods
   270      * @param <P> the type of the additional parameter to the visitor's methods
   271      * @param v   the visitor operating on this element
   272      * @param p   additional parameter to the visitor
   273      * @return a visitor-specified result
   274      */
   275     <R, P> R accept(ElementVisitor<R, P> v, P p);
   276 }

mercurial