Рассмотрим следующий код:
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)
любом случае), но для многих других аннотаций кажется, что это могло вызвать различные плохие вещи во время выполнения.