Considere el siguiente código:
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()));
}
}
La compilación y ejecución funciona como se esperaba:
$ javac *.java
$ java -cp . C
[@A()]
Pero luego considere esto:
$ rm A.class
$ java -cp . C
[]
Hubiera esperado que arrojara un ClassNotFoundException
, ya @A
que falta. Pero en cambio, deja caer silenciosamente la anotación.
¿Este comportamiento está documentado en alguna parte del JLS o es una peculiaridad del JVM de Sun? ¿Cuál es la razón fundamental para ello?
Parece conveniente para cosas como javax.annotation.Nonnull
(que parece que debería haber sido de @Retention(CLASS)
todos modos), pero para muchas otras anotaciones parece que podría causar que sucedan varias cosas malas en tiempo de ejecución.