Hi,

In the course of running the Bean Validation TCK on JDK 8, I'm
investigating an issue around reflectively accessing members of annotations
which are declared as inner type of another, package-private annotation
type.

The following shows an example:

    @Retention( RetentionPolicy.RUNTIME )
    /*package-private */ @interface Named {

        @Retention( RetentionPolicy.RUNTIME )
        /*package-private */ @interface List {
            Named[] value();
        }
    }

The @List annotation is used as this on a type in the same package:

    public class Foo {

        @Named.List( @Named )
        public void getBar() {}
    }

I'm then trying to access the @Named annotation using reflection like this:

    Annotation listAnnotation = Foo.class.getMethod( "getBar"
).getAnnotations()[0];

    Method method = listAnnotation.getClass().getMethod( "value" );
    method.setAccessible( true );

    //fails
    Annotation namedAnnotation = ( (Annotation[]) method.invoke(
listAnnotation ) )[0];

This is the exception I get:

    IllegalAccessError: tried to access class com.example.Named from class
com.sun.proxy.$Proxy3
      at com.sun.proxy.$Proxy3.value(Unknown Source)

Interestingly, this only occurs when the List annotation is declared as an
inner type within the Named type; it works when the List annotation is a
top-level package-private type (the Named annotation still being
package-private) as well as when it is declared as an inner type within
another package-private class.

I first thought that this might be related to 8004260 ("dynamic proxy class
should have the same Java language access as the proxy interfaces"), but
the issue occurs on on JDK 7 as well.

Is this a potential issue with the access check implementation or is
something wrong here with the way I'm accessing the annotation member?

Thanks for any help,

--Gunnar

Reply via email to