Considere o seguinte 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()));
}
}
Compilar e executar funciona conforme o esperado:
$ javac *.java
$ java -cp . C
[@A()]
Mas então considere isto:
$ rm A.class
$ java -cp . C
[]
Eu esperava que ele jogasse um ClassNotFoundException
, já que @A
está faltando. Mas em vez disso, ele descarta silenciosamente a anotação.
Esse comportamento está documentado no JLS em algum lugar ou é uma peculiaridade da JVM da Sun? Qual é a razão disso?
Parece conveniente para coisas como javax.annotation.Nonnull
(o que parece que deveria ser de @Retention(CLASS)
qualquer maneira), mas para muitas outras anotações, parece que pode causar várias coisas ruins em tempo de execução.