[type-annos-observers] Receivers and parameters annotated type question

Joel Borggren-Franck joel.franck at oracle.com
Thu Nov 21 07:04:50 PST 2013


Hi Elena,

Thanks for the report. This looks like a bug in core reflection.

I will file one.

cheers
/Joel

On 2013-11-21, elena votchennikova wrote:
> Please take a look at another case.
> 
> I've added constructor with InnerInner annotated parameter in every class.
> 
> -----------------------------------------------------------------------------------------
> public class MiniTest {
>     public MiniTest(@Annot(2) MiniTest. @Annot(3) Inner. @Annot(4)
> InnerInner param) {
>     }
> 
>     class Inner {
>         public Inner(@Annot(2) MiniTest. @Annot(3) Inner. @Annot(4)
> InnerInner param) {
>         }
> 
>         class InnerInner {
>             public InnerInner(@Annot(2) MiniTest. @Annot(3) Inner.
> @Annot(4) InnerInner param) {
>             }
>         }
>     }
> ...
> -----------------------------------------------------------------------------------------
> 
> And the result is strange too:
> -----------------------------------------------------------------------------------------
> MiniTest constructor1 parameter
> - annotations count: 1
>   Annot value: 4
> Inner constructor1 parameter
> - annotations count: 1
>   Annot value: 2
> InnerInner constructor1 parameter
> - annotations count: 1
>   Annot value: 3
> -----------------------------------------------------------------------------------------
> 
> The full mini-test is attached.
> 
> 
> Thanks a lot,
> Elena
> 
> 
> On 20.11.2013 16:06, elena votchennikova wrote:
> >Hi all,
> >
> >could you please help me to understand behavior of the following cases.
> >
> >I get annotations of annotated type via reflection API of the
> >following parameter (or receiver with the same annotated type)
> >@Annot(2) MiniTest. @Annot(3) Inner parameter
> >
> >The results are Ok for all cases except one - parameter of the
> >constructor of Inner class.
> >Please take a look at the example bellow.
> >
> >The output of the MiniTest run (on the jdk8-b116) will be
> >-------------------------------------------------------
> >
> >MiniTest constructor parameter
> >- annotations count: 1
> >  Annot value: 3
> >Inner constructor parameter
> >- annotations count: 1
> >  Annot value: 2
> >InnerInner constructor receiver
> >- annotations count: 1
> >  Annot value: 1
> >InnerInner constructor parameter
> >- annotations count: 1
> >  Annot value: 3
> >-------------------------------------------------------
> >
> >Looks like 'Annot value' for the 'Inner constructor parameter'
> >case should be 3.
> >
> >Thank you a lot,
> >Elena
> >
> >
> >public class MiniTest {
> >
> >    public MiniTest(@Annot(2) MiniTest. @Annot(3) Inner param) {
> >    }
> >
> >    class Inner {
> >
> >        public Inner(@Annot(2) MiniTest. @Annot(3) Inner param) {
> >        }
> >
> >        class InnerInner {
> >            public InnerInner(@Annot(0) MiniTest. @Annot(1) Inner
> >Inner.this, @Annot(2) MiniTest. @Annot(3) Inner param) {
> >            }
> >        }
> >    }
> >
> >    public static void main(String[] args) throws NoSuchMethodException {
> >        Constructor constructor =
> >MiniTest.class.getConstructor(Inner.class);
> >        AnnotatedType paramType =
> >constructor.getAnnotatedParameterTypes()[0];
> >        printInfo(paramType, "MiniTest constructor parameter");
> >
> >        Constructor innerConstructor =
> >Inner.class.getConstructor(MiniTest.class, Inner.class);
> >        AnnotatedType innerParamType =
> >innerConstructor.getAnnotatedParameterTypes()[0];
> >        printInfo(innerParamType, "Inner constructor parameter");
> >
> >        Constructor innerInnerConstructor =
> >Inner.InnerInner.class.getConstructor(Inner.class, Inner.class);
> >        AnnotatedType innerInnerReceiverType =
> >innerInnerConstructor.getAnnotatedReceiverType();
> >        printInfo(innerInnerReceiverType, "InnerInner constructor
> >receiver");
> >        AnnotatedType innerInnerParamType =
> >innerInnerConstructor.getAnnotatedParameterTypes()[0];
> >        printInfo(innerInnerParamType, "InnerInner constructor
> >parameter");
> >    }
> >
> >    private static void printInfo(AnnotatedType aType, String name) {
> >        System.out.println(name);
> >        System.out.println("- annotations count: " +
> >aType.getAnnotations().length);
> >        System.out.println("  Annot value: " + ((Annot)
> >aType.getAnnotations()[0]).value());
> >    }
> >}
> >
> >@Retention(RetentionPolicy.RUNTIME)
> >@Target(ElementType.TYPE_USE)
> >@interface Annot {
> >    int value();
> >}
> 

> import java.lang.annotation.*;
> import java.lang.reflect.AnnotatedType;
> import java.lang.reflect.Constructor;
> 
> public class MiniTest {
> 
>     public MiniTest(@Annot(2) MiniTest. @Annot(3) Inner param) {
>     }
> 
>     public MiniTest(@Annot(2) MiniTest. @Annot(3) Inner. @Annot(4) InnerInner param) {
>     }
> 
>     class Inner {
> 
>         public Inner(@Annot(2) MiniTest. @Annot(3) Inner param) {
>         }
> 
>         public Inner(@Annot(2) MiniTest. @Annot(3) Inner. @Annot(4) InnerInner param) {
>         }
> 
>         class InnerInner {
>             public InnerInner(@Annot(0) MiniTest. @Annot(1) Inner Inner.this, @Annot(2) MiniTest. @Annot(3) Inner param) {
>             }
> 
>             public InnerInner(@Annot(2) MiniTest. @Annot(3) Inner. @Annot(4) InnerInner param) {
>             }
>         }
>     }
> 
>     public static void main(String[] args) throws NoSuchMethodException {
>         Constructor constructor = MiniTest.class.getConstructor(Inner.class);
>         AnnotatedType paramType = constructor.getAnnotatedParameterTypes()[0];
>         printInfo(paramType, "MiniTest constructor parameter");
> 
>         Constructor innerConstructor = Inner.class.getConstructor(MiniTest.class, Inner.class);
>         AnnotatedType innerParamType = innerConstructor.getAnnotatedParameterTypes()[0];
>         printInfo(innerParamType, "Inner constructor parameter");
> 
>         Constructor innerInnerConstructor = Inner.InnerInner.class.getConstructor(Inner.class, Inner.class);
>         AnnotatedType innerInnerReceiverType = innerInnerConstructor.getAnnotatedReceiverType();
>         printInfo(innerInnerReceiverType, "InnerInner constructor receiver");
>         AnnotatedType innerInnerParamType = innerInnerConstructor.getAnnotatedParameterTypes()[0];
>         printInfo(innerInnerParamType, "InnerInner constructor parameter");
> 
>         System.out.println();
> 
>         Constructor constructor1 = MiniTest.class.getConstructor(Inner.InnerInner.class);
>         AnnotatedType paramType1 = constructor1.getAnnotatedParameterTypes()[0];
>         printInfo(paramType1, "MiniTest constructor1 parameter");
> 
>         Constructor innerConstructor1 = Inner.class.getConstructor(MiniTest.class, Inner.InnerInner.class);
>         AnnotatedType innerParamType1 = innerConstructor1.getAnnotatedParameterTypes()[0];
>         printInfo(innerParamType1, "Inner constructor1 parameter");
> 
>         Constructor innerInnerConstructor1 = Inner.InnerInner.class.getConstructor(Inner.class, Inner.InnerInner.class);
>         AnnotatedType innerInnerParamType1 = innerInnerConstructor1.getAnnotatedParameterTypes()[0];
>         printInfo(innerInnerParamType1, "InnerInner constructor1 parameter");
> 
>     }
> 
>     private static void printInfo(AnnotatedType aType, String name) {
>         System.out.println(name);
>         System.out.println("- annotations count: " + aType.getAnnotations().length);
>         System.out.println("  Annot value: " + ((Annot) aType.getAnnotations()[0]).value());
>     }
> }
> 
> @Retention(RetentionPolicy.RUNTIME)
> @Target(ElementType.TYPE_USE)
> @interface Annot {
>     int value();
> }


More information about the type-annotations-spec-observers mailing list