Aşağıdaki kodu göz önünde bulundurun:
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()));
}
}
Derleme ve çalıştırma, beklendiği gibi çalışır:
$ javac *.java
$ java -cp . C
[@A()]
Ama sonra şunu düşünün:
$ rm A.class
$ java -cp . C
[]
Bir atmak için beklerdim ClassNotFoundException
beri @A
kayıp. Ancak bunun yerine ek açıklamayı sessizce bırakır.
Bu davranış JLS'de bir yerde belgelenmiş mi, yoksa Sun'ın JVM'sinin bir tuhaflığı mı? Bunun mantığı nedir?
javax.annotation.Nonnull
( @Retention(CLASS)
Zaten olması gerektiği gibi görünüyor) gibi şeyler için uygun görünüyor , ancak diğer birçok ek açıklama için çalışma zamanında çeşitli kötü şeylerin olmasına neden olabilir gibi görünüyor.