Considere el siguiente código:¿Por qué una anotación faltante no causa una ClassNotFoundException en tiempo de ejecución?
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()));
}
}
Compilación y ejecución de las obras como se esperaba:
$ javac *.java
$ java -cp . C
[@A()]
Pero entonces considerar esto:
$ rm A.class
$ java -cp . C
[]
Hubiera esperado lanzar un ClassNotFoundException
, ya que @A
falta. Pero, en cambio, deja caer la anotación en silencio.
¿Está documentado este comportamiento en el JLS en alguna parte, o es una peculiaridad de la JVM de Sun? ¿Cuál es la razón para esto?
Parece conveniente para cosas como javax.annotation.Nonnull
(que parece que debería haber sido @Retention(CLASS)
de todos modos), pero para muchas otras anotaciones parece que podría causar varias cosas malas en el tiempo de ejecución.
@Retention está en java.lang.annotation - ¿cómo podría no estar disponible? –