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)])])

Reply via email to