考虑以下代码:
返回文章页面
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)
) ,但是对于其他许多注释来说,它似乎会在运行时导致各种各样的坏事情发生。