# HG changeset patch
# User darcy
# Date 1387558792 28800
# Node ID 18a23ba7dd3805247d196e1644594f9523c3c37c
# Parent 5f22afc7db58bba26bf5330b364a5a69fb6e708a
8023471: Add compatibility note to AnnotatedElement
Reviewed-by: smarks, jfranck, abuckley
diff -r 5f22afc7db58 -r 18a23ba7dd38 jdk/src/share/classes/java/lang/annotation/Annotation.java
--- a/jdk/src/share/classes/java/lang/annotation/Annotation.java Fri Dec 20 14:53:38 2013 +0100
+++ b/jdk/src/share/classes/java/lang/annotation/Annotation.java Fri Dec 20 08:59:52 2013 -0800
@@ -34,6 +34,10 @@
* More information about annotation types can be found in section 9.6 of
* The Java™ Language Specification.
*
+ * The {@link java.lang.reflect.AnnotatedElement} interface discusses
+ * compatibility concerns when evolving an annotation type from being
+ * non-repeatable to being repeatable.
+ *
* @author Josh Bloch
* @since 1.5
*/
diff -r 5f22afc7db58 -r 18a23ba7dd38 jdk/src/share/classes/java/lang/reflect/AnnotatedElement.java
--- a/jdk/src/share/classes/java/lang/reflect/AnnotatedElement.java Fri Dec 20 14:53:38 2013 +0100
+++ b/jdk/src/share/classes/java/lang/reflect/AnnotatedElement.java Fri Dec 20 08:59:52 2013 -0800
@@ -135,7 +135,77 @@
* 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.
+ *
+ *
+ *
+ * - Modifying T to be repeatable is source and binary
+ * compatible with existing uses of T and with existing uses
+ * of TC.
+ *
+ * That is, for source compatibility, source code with annotations of
+ * type T or of type TC will still compile. For binary
+ * compatibility, class files with annotations of type T or of
+ * type TC (or with other kinds of uses of type T or of
+ * type TC) will link against the modified version of T
+ * if they linked against the earlier version.
+ *
+ * (An annotation type TC may informally serve as an acting
+ * containing annotation type before T is modified to be
+ * formally repeatable. Alternatively, when T is made
+ * repeatable, TC can be introduced as a new type.)
+ *
+ *
- If an annotation type TC is present on an element, and
+ * T is modified to be repeatable with TC as its
+ * containing annotation type then:
+ *
+ *
+ *
+ * - The change to T is behaviorally compatible with respect
+ * to the {@code get[Declared]Annotation(Class)} (called with an
+ * argument of T or TC) and {@code
+ * get[Declared]Annotations()} methods because the results of the
+ * methods will not change due to TC becoming the containing
+ * annotation type for T.
+ *
+ *
- The change to T changes the results of the {@code
+ * get[Declared]AnnotationsByType(Class)} methods called with an
+ * argument of T, because those methods will now recognize an
+ * annotation of type TC as a container annotation for T
+ * and will "look through" it to expose annotations of type T.
+ *
+ *
+ *
+ * - If an annotation of type T is present on an
+ * element and T is made repeatable and more annotations of
+ * type T are added to the element:
+ *
+ *
+ *
+ * - The addition of the annotations of type T is both
+ * source compatible and binary compatible.
+ *
+ *
- The addition of the annotations of type T changes the results
+ * of the {@code get[Declared]Annotation(Class)} 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 T.
+ *
+ *
- The addition of the annotations of type T changes the
+ * results of the {@code get[Declared]AnnotationsByType(Class)}
+ * methods, because their results will expose the additional
+ * annotations of type T whereas previously they exposed only a
+ * single annotation of type T.
+ *
+ *
+ *
+ *
+ *
* 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