Warum verursacht eine fehlende Anmerkung zur Laufzeit keine ClassNotFoundException?

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()));
        }
}

Kompilieren und Ausführen funktioniert wie erwartet:

$ javac *.java
$ java -cp . C
[@A()]

Aber dann überlege:

$ rm A.class
$ java -cp . C
[]

ch hätte erwartet, dass es ein @ wirClassNotFoundException, schon seit@A wird vermisst. Stattdessen wird die Anmerkung stillschweigend gelöscht.

Ist dieses Verhalten irgendwo in der JLS dokumentiert oder ist es eine Eigenheit der JVM von Sun? Was ist der Grund dafür?

Es scheint praktisch für Dinge wiejavax.annotation.Nonnull (was scheint, als hätte es sein sollen@Retention(CLASS) sowieso), aber für viele andere Annotationen scheint es, als könnte es zur Laufzeit verschiedene schlimme Dinge verursachen.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage