@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.ANNOTATION_TYPE}) // line 3
public @interface Target {
ElementType[] value();
}
上面的代码是Java中
Target
的源代码。目标注解怎么能这样定义呢?看起来第 3 行不应该允许它,因为 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;
}
}
我试图理解。
如果你尝试一些东西,你往往会学到更多,而不是在 Stack Overflow 上询问。那么,让我们这样做吧:
> cat Test.java
@Test
@interface Test {}
> javac Test.java
运行良好,没有来自 javac 的抱怨。所以,是的,您可以用自身来注释
@interface
定义。
Javac 不只是逐行解析。如果确实如此,那么这将如何工作:
class Test {
void foo() {
bar(); // wait! This hasn't been defined yet!
}
void bar() {}
}
除了..效果很好。
Javac 首先解析文件,将其从一袋字符转换为树结构。它对您告诉它编译的所有源文件执行此操作。
然后它“属性”所有这些节点。这是
java.lang.String
从“在节点 java.lang
上选择事物‘String’(这是节点 java
上的‘选择事物’lang’,这是一个“Ident java
”)转变为“a”对类型java.lang.String
的引用。此阶段需要一个类路径。
然后它开始编译与之前阶段无关的细节,例如实际解析方法体,是的,还有注释。