निम्नलिखित कोड पर विचार करें:
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)
वैसे भी होना चाहिए था ), लेकिन कई अन्य एनोटेशन के लिए ऐसा लगता है कि यह विभिन्न खराब चीजों को रनटाइम पर हो सकता है।