Considérez le code suivant:
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 compilation et l'exécution fonctionnent comme prévu:
$ javac *.java
$ java -cp . C
[@A()]
Mais alors considérez ceci:
$ rm A.class
$ java -cp . C
[]
Je me serais attendu à ce qu'il lance un ClassNotFoundException
, car il @A
manque. Mais au lieu de cela, il supprime silencieusement l'annotation.
Ce comportement est-il documenté quelque part dans le JLS ou est-ce une bizarrerie de la JVM de Sun? Quelle en est la raison?
Cela semble pratique pour des choses comme javax.annotation.Nonnull
(ce qui semble avoir dû l'être de @Retention(CLASS)
toute façon), mais pour de nombreuses autres annotations, il semble que cela puisse provoquer diverses mauvaises choses au moment de l'exécution.