Considera il codice seguente:
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 compilazione e l'esecuzione funziona come previsto:
$ javac *.java
$ java -cp . C
[@A()]
Ma poi considera questo:
$ rm A.class
$ java -cp . C
[]
Mi sarei aspettato che lanciasse un ClassNotFoundException
, poiché @A
manca. Invece, elimina silenziosamente l'annotazione.
Questo comportamento è documentato da qualche parte nella JLS o è una stranezza della JVM di Sun? Qual è il motivo?
Sembra conveniente per cose come javax.annotation.Nonnull
(che sembra che avrebbe dovuto essere @Retention(CLASS)
comunque), ma per molte altre annotazioni sembra che potrebbe causare varie cose brutte in fase di esecuzione.