考虑下面的代码:为什么在运行时没有缺少注释会导致ClassNotFoundException?
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)
)似乎很方便,但对于许多其他注释,它似乎可能会导致在运行时发生各种不好的事情。
@Retention在java.lang.annotation中 - 它怎么可能不可用? – 2010-08-25 20:05:35