考虑以下代码:
A.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)
反之亦然),但对于许多其他注释,它似乎可能导致运行时发生各种不良情况。