为什么缺少的注释在运行时不会导致 ClassNotFoundException?
请考虑以下代码:
答.java:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@interface A{}
C.java:
import java.util.*;
@A public class C {
public static void main(String[] args){
System.out.println(Arrays.toString(C.class.getAnnotations()));
}
}
编译和运行按预期工作:
$ javac *.java
$ java -cp . C
[@A()]
但请再考虑一下:
$ rm A.class
$ java -cp . C
[]
我本来以为它会抛出一个,因为缺少了。但相反,它默默地删除了注释。ClassNotFoundException
@A
这种行为是否记录在JLS的某个地方,或者它是Sun的JVM的一个怪癖?它的理由是什么?
对于这样的事情来说,这似乎很方便(似乎无论如何都应该如此),但对于许多其他注释来说,它似乎可能导致在运行时发生各种不好的事情。javax.annotation.Nonnull
@Retention(CLASS)