A question about Depth of container annotations
Joe Darcy
joe.darcy at oracle.com
Tue Jun 24 18:23:37 UTC 2014
Hello,
The behavior you're interested in is defined in the AnnotatedElement
specification:
http://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AnnotatedElement.html
In brief, none of the methods in AnnotatedElement look through more than
one level of containment. (Likewise, when writing repeated annotation in
source code, the compiler will only create one level of containers.)
You may be interested in reviewing design discussions of this feature
that occurred on
http://mail.openjdk.java.net/mailman/listinfo/enhanced-metadata-spec-discuss
Cheers,
-Joe
On 06/24/2014 01:21 AM, deven you wrote:
> Hi All,
>
> I have a question about repeated annotation depth. If this is not the
> proper mailing list group, please tell me where I should send it to.
>
> My question will be about the depth of container annotations. For instance,
> assume there are 3 annotations.
> - RepeatedAnn
> - ContainerAnn
> - ContainerContainerAnn
>
> So, ContainerContainerAnn can have ContainerAnn and that can also have
> RepeatbleAnn in it.
>
> In this case, get*AnnotationsByType(RepeatableAnn) APIs wont return
> repeteableAnns in depth 2.
>
> Java docs don't talk about the depth. I wonder if the get*AnnotationsByType
> api should return the annotations of all depth?
>
> If we have below annotations:
> @Retention(RetentionPolicy.RUNTIME)
> @Repeatable(ContainerAnn.class)
> @interface RepeatableAnn { String value(); }
>
> @Inherited
> @Retention(RetentionPolicy.RUNTIME)
> @Repeatable(ContainerContainerAnn.class)
> @interface ContainerAnn { RepeatableAnn[] value(); }
>
> @Inherited
> @Retention(RetentionPolicy.RUNTIME)
> @interface ContainerContainerAnn { ContainerAnn[] value(); }
>
> And the main class is annotated by :
>
> @ContainerAnn({@RepeatableAnn("Parent-3")})
> @ContainerAnn({@RepeatableAnn("Parent-4")})
> public class Test { ...
>
> when we call getAnnotationsByType(RepeatableAnn.class) on this class, we
> get nothing because RepeatableAnn is contained by ContainerAnn which is
> also contained by ContainerContainerAnn. In other words, RepeatableAnn is
> in depth 2 and get*AnnotationsByType APIs only searches depth 1. The test
> results are:
>
> /home/deven/jdk8_20/jdk1.8.0_20/bin$ java repeated.Test
> CLASS = repeated.Test
> getDeclaredAnnotationsByType(RepeatableAnn.class)
> getDeclaredAnnotationsByType(ContainerAnn.class)
>
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-3)])
>
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-4)])
> getDeclaredAnnotationsByType(ContainerContainerAnn.class)
>
> @repeated.ContainerContainerAnn(value=[@repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-3)]),
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-4)])])
> getAnnotationsByType(RepeatableAnn.class)
> getAnnotationsByType(ContainerAnn.class)
>
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-3)])
>
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-4)])
> getAnnotationsByType(ContainerContainerAnn.class)
>
> @repeated.ContainerContainerAnn(value=[@repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-3)]),
> @repeated.ContainerAnn(value=[@repeated.RepeatableAnn(value=Parent-4)])])
More information about the core-libs-dev
mailing list