Java中@Target注解如何单独使用?

问题描述 投票:0回答:1
@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;
    }
}

我试图理解。

java annotations
1个回答
1
投票

如果你尝试一些东西,你往往会学到更多,而不是在 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
的引用。此阶段需要一个类路径。

然后它开始编译与之前阶段无关的细节,例如实际解析方法体,是的,还有注释。

© www.soinside.com 2019 - 2024. All rights reserved.