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 --- */

Reply via email to