JavaNewbie_M107
JavaNewbie_M107

Reputation: 2037

How is it possible that an annotation can be an annotation to itself?

I was browsing through the documentation of JDK 7 when I noticed an annotation called @Target in package java.lang.annotation. The header of that class is

@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Target

Now, @Target is used as an annotation to itself. How is this possible? @Target is used in the header even before it is declared. I tried this with annotations I had written, and it worked as well. Can anyone explain what's happening here?

Upvotes: 7

Views: 580

Answers (1)

Matt McHenry
Matt McHenry

Reputation: 20919

The JLS specifically anticipates this, in section 9.6 Annotation Types:

If an annotation a (§9.7) on an annotation type declaration corresponds to an annotation type T, and T has a (meta-)annotation m that corresponds to java.lang.annotation.Target, then m must have either an element whose value is java.lang.annotation.ElementType.ANNOTATION_TYPE, or an element whose value is java.lang.annotation.ElementType.TYPE, or a compile-time error occurs.

No other part of section 9.6 or 9.7 says anything about it being illegal for an annotation declaration to be annotated with a reference to the annotation being declared.

Upvotes: 3

Related Questions