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