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

elena votchennikova elena.votchennikova at oracle.com
Thu Nov 21 07:29:31 PST 2013


Hi Joel,

thank you a lot for taking care about it.

Is my understanding correct:
if we have the following definition of the parameter
@Annot(0) MiniTest. @Annot(1) Inner. @Annot(2) InnerInner param

then AnnotatedType of the param will has type InnerInner with the only 
one annotation @Annot(2) because other annotations (@Annot(1) and 
@Annot(0)) relate to the Inner and MiniTest types corresponding.


Thank you,
Elena

On 21.11.2013 19:04, Joel Borggren-Franck wrote:
> 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