Reflection, TYPE_USE annotation on THROWS on inner class constructor, Java 9+

Vicente Romero vicente.romero at oracle.com
Wed Nov 14 22:01:16 UTC 2018


Hi Michael,

Thanks for the report. I have created: 
https://bugs.openjdk.java.net/browse/JDK-8213905 to track it,

Vicente

On 11/9/18 10:13 AM, Michael Rasmussen wrote:
> Hi
>
> When adding a TYPE_USE annotation with runtime retention to the throws exception clause of a constructor of an inner class, these annotations are not found via Constructor.getAnnotatedExceptionType().getDeclaredAnnotations() on Java 9+, but present when running on Java 8.
> For static nested classes, the annotations are correctly found on Java 9+.
>
> See sample code below.
>
> Looking in the .class file for the nested classes (with javap), the runtime annotation is present there:
>    public app1.MiscTest8$Inner(app1.MiscTest8) throws java.lang.Exception;
>      (...)
>      RuntimeVisibleTypeAnnotations:
>        0: #17(): THROWS, type_index=0
>          app1.MiscTest8$MyAnnotation
>
> and
>    public app1.MiscTest8$StaticInner() throws java.lang.Exception;
>      (...)
>      RuntimeVisibleTypeAnnotations:
>        0: #14(): THROWS, type_index=0
>          app1.MiscTest8$MyAnnotation
>
> When I run it on Java 8, I get the following output:
> === public app1.MiscTest8$Inner(app1.MiscTest8) throws java.lang.Exception ===
> [@app1.MiscTest8$MyAnnotation()]
> === public app1.MiscTest8$StaticInner() throws java.lang.Exception ===
> [@app1.MiscTest8$MyAnnotation()]
> === public static void app1.MiscTest8.main(java.lang.String[]) throws java.lang.Exception ===
> [@app1.MiscTest8$MyAnnotation()]
>
> But when I run the same class files on Java 9, 10, 11, (and 12-ea) I get:
> === public app1.MiscTest8$Inner(app1.MiscTest8) throws java.lang.Exception ===
> []
> === public app1.MiscTest8$StaticInner() throws java.lang.Exception ===
> [@app1.MiscTest8$MyAnnotation()]
> === public static void app1.MiscTest8.main(java.lang.String[]) throws java.lang.Exception ===
> [@app1.MiscTest8$MyAnnotation()]
>
>
> Shouldn't I be able to find this annotation vis getAnnotatedExceptionTypes() on Java9+, similar to how it works on Java 8?
>
> Kind regards
> Michael Rasmussen.
>
>
> /* --- snip --- */
> package app1;
>
> import java.lang.annotation.ElementType;
> import java.lang.annotation.Retention;
> import java.lang.annotation.RetentionPolicy;
> import java.lang.annotation.Target;
> import java.lang.reflect.AnnotatedType;
> import java.lang.reflect.Executable;
> import java.util.Arrays;
>
> public class MiscTest8 {
>
>    @Retention(value = RetentionPolicy.RUNTIME)
>    @Target(ElementType.TYPE_USE)
>    @interface MyAnnotation {
>    }
>
>    class Inner {
>      public Inner() throws @MyAnnotation Exception {
>      }
>    }
>
>    static class StaticInner {
>      public StaticInner() throws @MyAnnotation Exception {
>      }
>    }
>    public static void main(String[] args) throws @MyAnnotation Exception {
>      foo(Inner.class.getDeclaredConstructor(MiscTest8.class));
>      foo(StaticInner.class.getDeclaredConstructor());
>      foo(MiscTest8.class.getDeclaredMethod("main", String[].class));
>    }
>
>    static void foo(Executable c) throws Exception {
>      System.out.println("=== " + c + " ===");
>
>      for (AnnotatedType exceptionType : c.getAnnotatedExceptionTypes()) {
>        System.out.println(Arrays.toString(exceptionType.getDeclaredAnnotations()));
>      }
>    }
> }
> /* --- snap --- */



More information about the core-libs-dev mailing list