以明确的方式有谁能解释之间的实际差别java.lang.annotation.RetentionPolicy常数SOURCE,CLASS和RUNTIME?
我也不完全确定"保留注释"这个短语是什么意思.
请考虑以下代码:
A.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
Run Code Online (Sandbox Code Playgroud)
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
Run Code Online (Sandbox Code Playgroud)
但是考虑一下:
$ rm A.class
$ java -cp . C
[]
Run Code Online (Sandbox Code Playgroud)
我会期望它抛出一个ClassNotFoundException,因为@A缺少.但相反,它会默默地删除注释.
这种行为是在JLS的某个地方记录的,还是Sun的JVM的怪癖?它的基本原理是什么?
这样的事情似乎很方便javax.annotation.Nonnull(看起来应该是这样@Retention(CLASS)的)但是对于许多其他注释来说,似乎它可能会导致在运行时发生各种不好的事情.