Java中@Target注解为何可标注自身?语法合理性疑问
关于Java中@Target注解自标注的疑问
先看Java中Target注解的源码:
@Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.ANNOTATION_TYPE}) // line 3 public @interface Target { ElementType[] value(); }
为什么可以这样定义Target注解?第3行用@Target标注自身似乎不应该被允许,毕竟此时Target还没完成定义;这是否和下面的二叉树节点类那种嵌套数据结构类似?
二叉树节点类代码:
public class BinaryTreeNode { public int val; public BinaryTreeNode leftChild; public BinaryTreeNode rightChild; public BinaryTreeNode(int val) { this.val = val; } public static void main(String[] args) { BinaryTreeNode lChild = new BinaryTreeNode(1); BinaryTreeNode rChild = new BinaryTreeNode(2); BinaryTreeNode bt = new BinaryTreeNode(0); bt.leftChild = lChild; bt.rightChild = rChild; } }
解答:
这和二叉树节点的情况完全不同。二叉树节点是在类内部声明自身类型的成员变量,属于类实例的嵌套引用设计;而@Target的自标注是Java注解机制的特殊规则允许的。
Java编译器处理注解定义时,会先识别出这是一个注解类型(通过@interface关键字),之后再处理它上面的元注解。对于@Target这种元注解,编译器不需要等Target注解完全定义完成就可以处理它的自标注——因为@Target的作用是限定当前注解的适用元素类型,编译器此时只需要明确ElementType.ANNOTATION_TYPE的含义,以及@Target元注解的核心作用即可,不需要依赖Target注解类的完整定义细节。
本质上这是Java语言规范的特殊设计:元注解可以标注自身,目的是让元注解自身符合它所定义的规则——比如@Target注解本身只能用来标注其他注解类型,所以它自己也用@Target(ANNOTATION_TYPE)标注,明确自身的适用范围,这是合理的设计,并非语法上的“未定义引用”问题。
内容的提问来源于stack exchange,提问作者Stack
相关产品推荐
相关产品推荐

