src/share/classes/java/lang/reflect/AnnotatedElement.java

Print this page

        

*** 133,143 **** * T >)}, the order of annotations which are directly or indirectly * present on an element <i>E</i> is computed as if indirectly present * annotations on <i>E</i> are directly present on <i>E</i> in place * of their container annotation, in the order in which they appear in * the value element of the container annotation. ! * <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}. --- 133,214 ---- * T >)}, the order of annotations which are directly or indirectly * present on an element <i>E</i> is computed as if indirectly present * annotations on <i>E</i> are directly present on <i>E</i> in place * of their container annotation, in the order in which they appear in * the value element of the container annotation. ! * ! * <p>There are several compatibility concerns to keep in mind if an ! * annotation type <i>T</i> is originally <em>not</em> repeatable and ! * later modified to be repeatable. ! * ! * The containing annotation type for <i>T</i> is <i>TC</i>. ! * ! * <ul> ! * ! * <li>Modifying <i>T</i> to be repeatable is source and binary ! * compatible with existing uses of <i>T</i> and with existing uses ! * of <i>TC</i>. ! * ! * That is, for source compatibility, source code with annotations of ! * type <i>T</i> or of type <i>TC</i> will still compile. For binary ! * compatibility, class files with annotations of type <i>T</i> or of ! * type <i>TC</i> (or with other kinds of uses of type <i>T</i> or of ! * type <i>TC</i>) will link against the modified version of <i>T</i> ! * if they linked against the earlier version. ! * ! * (An annotation type <i>TC</i> may informally serve as an acting ! * containing annotation type before <i>T</i> is modified to be ! * formally repeatable. Alternatively, when <i>T</i> is made ! * repeatable, <i>TC</i> can be introduced as a new type.) ! * ! * <li>If an annotation type <i>TC</i> is present on an element, and ! * <i>T</i> is modified to be repeatable with <i>TC</i> as its ! * containing annotation type then: ! * ! * <ul> ! * ! * <li>The change to <i>T</i> is behaviorally compatible with respect ! * to the {@code get[Declared]Annotation(Class<T>)} (called with an ! * argument of <i>T</i> or <i>TC</i>) and {@code ! * get[Declared]Annotations()} methods because the results of the ! * methods will not change due to <i>TC</i> becoming the containing ! * annotation type for <i>T</i>. ! * ! * <li>The change to <i>T</i> is <em>not</em> behaviorally compatible ! * with respect to the {@code ! * get[Declared]AnnotationsByType(Class<T>)} methods, because those ! * methods will now recognize an annotation of type <i>TC</i> as a ! * container annotation and will "look through" it to expose ! * annotations of type <i>T</i>. ! * ! * </ul> ! * ! * <li>If an annotation of type <i>T</i> is present on an ! * element and <i>T</i> is made repeatable and more annotations of ! * type <i>T</i> are added to the element: ! * ! * <ul> ! * ! * <li> The addition of the additional annotations is both source ! * compatible and binary compatible. ! * ! * <li>The addition of the additional annotations changes the results ! * of the {@code get[Declared]Annotation(Class<T>)} methods and {@code ! * get[Declared]Annotations()} methods, because those methods will now ! * only see a container annotation on the element and not see an ! * annotation of type <i>T</i>. ! * ! * <li>The addition of the additional annotations changes the results ! * of the {@code get[Declared]AnnotationsByType(Class<T>)} methods, ! * because their results will expose the additional annotations of ! * type <i>T</i> whereas previously they exposed only a single ! * annotation of type <i>T</i>. ! * ! * </ul> ! * ! * </ul> ! * * <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}.