如果这个注释没有写入字节码,那怎么能在运行时访问?

时间:2018-04-13 19:47:38

标签: java annotations

  
      
  • RetentionPolicy.SOURCE:放弃期间   编译。这些注释并不适用   在编译之后有意义   完成了,所以他们没有写到   字节码。
      示例:@Override@SuppressWarnings
  •   

如果以下注释名为MyAnno未写入字节码(.class文件),如何在运行时访问它?实施例。

@Retention(RetentionPolicy.SOURCE)
@interface MyAnno {
    int a = 4;
    int val();
}

public class Example {

    public static void test() {
        System.out.println("MyAnno.a = " + MyAnno.a);
        MyAnno myAnno = new MyAnno() {
            public int val() {
                return 7;
            }
            public Class<? extends Annotation> annotationType() {
                return null;
            }
        };
        System.out.println("myAnno.val = " + myAnno.val());

        Override ov = new Override() {
            public Class<? extends Annotation> annotationType() {
                return null;
            }
        };
    }

    public static void main(String[] args) {
        test();
    }
}

以上代码正在运行,没有任何错误。

2 个答案:

答案 0 :(得分:3)

RetentionPolicy是关于类的类文件,您在其中添加了注释,而不是注释本身的类文件,例如:

@MyAnno
public class TestClass {}

RetentionPolicy.SOURCE表示如果您将注释添加到类中,然后尝试使用TestClass.class.getAnnotations()获取该类的所有注释,则它不会成为结果的一部分。

答案 1 :(得分:2)

你误解了RetentionPolicy的目的:它指的是你的类型注释会发生什么,而不是类型本身。

Documentation声明如下:

  

仅当元注释类型直接用于注释时,保留元注释才有效。如果元注释类型在另一个注释类型中用作成员类型,则无效。

您的程序直接使用元注释类型MyAnno,而不是将其用于注释。因此,保留策略注释无效。