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