当我注意到包@Target
中有一个名为java.lang.annotation
的注释时,我浏览了JDK 7的文档。该类的标题是
@Documented
@Retention(value=RUNTIME)
@Target(value=ANNOTATION_TYPE)
public @interface Target
现在,@Target
被用作自身的注释。这怎么可能?标题中使用@Target
甚至在声明之前。我用我编写的注释尝试了这个,它也运行良好。谁能解释一下这里发生了什么?
答案 0 :(得分:3)
JLS在section 9.6 Annotation Types中特别预见到了这一点:
如果注释
a
(§9.7) 注释类型声明对应于注释类型T
,T
有一个(meta)注释m
,对应于java.lang.annotation.Target
,然后m
必须有一个元素 其值为java.lang.annotation.ElementType.ANNOTATION_TYPE
,或 值为java.lang.annotation.ElementType.TYPE
的元素,或 发生编译时错误。
第9.6或9.7节中没有任何其他部分说明注释声明通过引用正在声明的注释进行注释是非法的。