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