निम्नलिखित कोड पर विचार करें:
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()));
}
}
उम्मीद के मुताबिक काम करना और चलाना:
$ javac *.java
$ java -cp . C
[@A()]
लेकिन फिर इस पर विचार करें:
$ rm A.class
$ java -cp . C
[]
मुझे उम्मीद है कि यह एक को फेंक देगा ClassNotFoundException, क्योंकि @Aगायब है। लेकिन इसके बजाय, यह चुपचाप एनोटेशन को गिरा देता है।
क्या यह व्यवहार कहीं-कहीं जेएलएस में प्रलेखित है, या यह सूर्य के जेवीएम का एक प्रश्न है? इसके लिए तर्क क्या है?
यह चीजों के लिए सुविधाजनक लगता है javax.annotation.Nonnull( जैसे लगता है कि यह @Retention(CLASS)वैसे भी होना चाहिए था ), लेकिन कई अन्य एनोटेशन के लिए ऐसा लगता है कि यह विभिन्न खराब चीजों को रनटाइम पर हो सकता है।