JDK 9 RFR of JDK-8006469:Cleanup reflective access of java.lang.annotation.Repeatable
Joel Borggrén-Franck
joel.franck at oracle.com
Mon Jan 12 16:22:21 UTC 2015
Time files :)
Looks good!
cheers
/Joel
> On 10 jan 2015, at 19:09, joe darcy <joe.darcy at oracle.com> wrote:
>
> Hello,
>
> With JDK 9 now bootstrapping off of JDK 8, please review this fix to simplify access to the Repeatable annotation within javac; reflective access can be replaced with direct access:
>
> http://cr.openjdk.java.net/~darcy/8006469.0/
>
> Tests pass as expected; patch below.
>
> Thanks,
>
> -Joe
>
> --- old/src/jdk.compiler/share/classes/com/sun/tools/javac/code/AnnoConstruct.java 2015-01-09 22:58:28.867563577 -0800
> +++ new/src/jdk.compiler/share/classes/com/sun/tools/javac/code/AnnoConstruct.java 2015-01-09 22:58:28.771563577 -0800
> @@ -26,6 +26,7 @@
>
> import java.lang.annotation.Annotation;
> import java.lang.annotation.Inherited;
> +import java.lang.annotation.Repeatable;
> import java.lang.reflect.InvocationTargetException;
> import java.lang.reflect.Method;
>
> @@ -183,65 +184,12 @@
> return c == null ? null : AnnotationProxyMaker.generateAnnotation(c, annoType);
> }
>
> - // Needed to unpack the runtime view of containing annotations
> - private static final Class<? extends Annotation> REPEATABLE_CLASS = initRepeatable();
> - private static final Method VALUE_ELEMENT_METHOD = initValueElementMethod();
> -
> - private static Class<? extends Annotation> initRepeatable() {
> - try {
> - // Repeatable will not be available when bootstrapping on
> - // JDK 7 so use a reflective lookup instead of a class
> - // literal for Repeatable.class.
> - return Class.forName("java.lang.annotation.Repeatable").asSubclass(Annotation.class);
> - } catch (ClassNotFoundException | SecurityException e) {
> - return null;
> - }
> - }
> -
> - private static Method initValueElementMethod() {
> - if (REPEATABLE_CLASS == null)
> - return null;
> -
> - Method m = null;
> - try {
> - m = REPEATABLE_CLASS.getMethod("value");
> - if (m != null)
> - m.setAccessible(true);
> - return m;
> - } catch (NoSuchMethodException e) {
> - return null;
> - }
> - }
> -
> -
> // Helper to getAnnotationsByType
> private static Class<? extends Annotation> getContainer(Class<? extends Annotation> annoType) {
> - // Since we can not refer to java.lang.annotation.Repeatable until we are
> - // bootstrapping with java 8 we need to get the Repeatable annotation using
> - // reflective invocations instead of just using its type and element method.
> - if (REPEATABLE_CLASS != null &&
> - VALUE_ELEMENT_METHOD != null) {
> - // Get the Repeatable instance on the annotations declaration
> - Annotation repeatable = (Annotation)annoType.getAnnotation(REPEATABLE_CLASS);
> - if (repeatable != null) {
> - try {
> - // Get the value element, it should be a class
> - // indicating the containing annotation type
> - @SuppressWarnings("unchecked")
> - Class<? extends Annotation> containerType = (Class)VALUE_ELEMENT_METHOD.invoke(repeatable);
> - if (containerType == null)
> - return null;
> -
> - return containerType;
> - } catch (ClassCastException | IllegalAccessException | InvocationTargetException e) {
> - return null;
> - }
> - }
> - }
> - return null;
> + Repeatable repeatable = annoType.getAnnotation(Repeatable.class);
> + return (repeatable == null) ? null : repeatable.value();
> }
>
> -
> // Helper to getAnnotationsByType
> private static Attribute[] unpackAttributes(Attribute.Compound container) {
> // We now have an instance of the container,
>
More information about the compiler-dev
mailing list