Betrachten Sie den folgenden Code ein:Warum verursacht eine fehlende Anmerkung während der Laufzeit keine ClassNotFoundException?
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()));
}
}
Kompilieren und Ausführen funktioniert wie erwartet:
$ javac *.java
$ java -cp . C
[@A()]
Aber dann prüfen dies:
$ rm A.class
$ java -cp . C
[]
Ich hätte erwartet, dass es eine ClassNotFoundException
werfen, da @A
fehlt. Stattdessen wird die Annotation stillgelegt.
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 scheint, als hätte es @Retention(CLASS)
sowieso sein sollte), aber für viele andere Anmerkungen scheint es könnte dazu führen, dass verschiedene schlechte Dinge zur Laufzeit passieren.
@Retention ist in java.lang.annotation - wie könnte es nicht verfügbar sein? –