Betrachten Sie den folgenden Code:
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()));
}
}
Das Kompilieren und Ausführen funktioniert wie erwartet:
$ javac *.java
$ java -cp . C
[@A()]
Aber dann bedenken Sie Folgendes:
$ rm A.class
$ java -cp . C
[]
Ich hätte erwartet, dass es einen wirft ClassNotFoundException
, da @A
es fehlt. Stattdessen wird die Anmerkung stillschweigend gelöscht.
Ist dieses Verhalten irgendwo in der JLS dokumentiert oder ist es eine Eigenart von Suns JVM? Was ist der Grund dafür?
Es scheint praktisch für Dinge wie javax.annotation.Nonnull
(was @Retention(CLASS)
sowieso hätte sein sollen), aber für viele andere Anmerkungen scheint es, dass es zur Laufzeit verschiedene schlechte Dinge verursachen könnte.
quelle