考慮下面的代碼:爲什麼在運行時沒有缺少註釋會導致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