[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