Problems with ElementType.TYPE_USE and reflection

Joseph D. Darcy joe.darcy at oracle.com
Wed Nov 7 00:10:06 UTC 2018


Hello,

To get the type annotations on a field you would have to use

     field.getAnnotatedType().getAnnotations();

See

https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/reflect/Field.html#getAnnotatedType()

Calling getAnnotations on a field returns the declaration annotations.

HTH,

-Joe

On 11/6/2018 10:48 AM, Kasper Nielsen wrote:
> Hi,
>
> I'm trying to understand exactly how ElementType.TYPE_USE should work.
>
> I'm asking because the following program only prints that s has one 2
> annotation.
> I believe it should either print 3 or be flagged at compilation time.
>
> public class TestClass {
>
>      @X
>      @Y
>      @Z
>      String s;
>
>      public static void main(String[] args) throws Exception {
>
> System.out.println(TestClass.class.getDeclaredField("s").getAnnotations().length);
>      }
>
>      @Retention(RetentionPolicy.RUNTIME)
>      @Target(ElementType.TYPE_USE)
>      @interface X {}
>
>      @Retention(RetentionPolicy.RUNTIME)
>      @Target(ElementType.FIELD)
>      @interface Y {}
>
>      @Retention(RetentionPolicy.RUNTIME)
>      @Target({ ElementType.FIELD, ElementType.TYPE_USE })
>      @interface Z {}
> }
>
> ElementType.TYPE_USE alone isn't enough for the annotation information to
> be retained at runtime.
>
> /Kasper



More information about the core-libs-dev mailing list