Considérons 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 fonctionne comme prévu:
$ javac *.java
$ java -cp . C
[@A()]
Mais considérez ceci:
$ rm A.class
$ java -cp . C
[]
Je l'ai attendu pour lancer un ClassNotFoundException
, depuis @A
est manquant. Mais au lieu de cela, il silencieusement gouttes de l'annotation.
Ce comportement est-il documenté dans le JLS quelque part, ou est-ce un caprice de Sun JVM? Quelle est la justification?
Il paraît commode pour des choses comme l' javax.annotation.Nonnull
(ce qui semble comme il aurait été @Retention(CLASS)
tout de même), mais pour beaucoup d'autres annotations, il semble que cela pourrait provoquer diverses mauvaises choses de se produire lors de l'exécution.