Рассмотрим следующий код:Почему отсутствующая аннотация вызывает исключение 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 где-то, или это причуда JVM Sun? В чем причина?
Кажется, это удобно для таких вещей, как javax.annotation.Nonnull
(похоже, должно было быть @Retention(CLASS)
), но для многих других аннотаций кажется, что это может вызвать различные плохие вещи во время выполнения.
@Возврат в java.lang.annotation - как он не может быть доступен? –