मुझे पूरा यकीन नहीं है कि मैं सवाल समझता हूं लेकिन जावा कक्षाओं में पहले से ही उन सभी पर प्रतिबिंब करने की आवश्यकता है। ए। क्लास फ़ाइल इस बात के आधार पर नहीं बदली जाती है कि इसका उपयोग कैसे किया जाता है।
संपादित करें 1: "प्रतिबिंब" के प्रकार को बेहतर तरीके से अलग करने के लिए कुछ और विशिष्ट उदाहरण प्रदान करना, जिसके बारे में हम बात कर रहे हैं।
उदाहरण:
class Foo {
public void bar() {
System.out.println("Hello, world.");
}
}
// Conventional calling
Foo f = new Foo();
foo.bar();
// Reflection based callling
Class fooClass = Class.forName("Foo");
Method m = fooClass.getMethod("bar", null);
Object f = fooClass.newInstance();
m.invoke(m, null);
पारंपरिक बुला मामले में, Foo.class और इसके प्रत्यक्ष वर्ग निर्भरता के किसी भी लोड किया जाएगा। बार निष्पादित किया जाएगा। स्ट्रिंग्स "फू" और "बार" को कॉलिंग क्लास के हिस्से के रूप में पहले से ही इंटर्न किया जाएगा क्योंकि बाइट कोड रनटाइम पर कक्षाओं और विधियों को हल करने के लिए तारों का उपयोग करता है। (वास्तव में "बार" पूर्ण विधि हस्ताक्षर होगा, वास्तव में केवल "बार" से अधिक लंबा)
प्रतिबिंब मामले में, बिल्कुल वही होता है। लोड किया गया एकमात्र अतिरिक्त वर्ग Method.class है। यह अनुमति आकार के लिए एकमात्र प्रभाव होना चाहिए।
बाद के मामले में प्रदर्शन प्रभाव पड़ता है। विधि लुक-अप अपेक्षाकृत महंगी है इसलिए जब आप कर सकते हैं विधि ऑब्जेक्ट कैश करने की सलाह दी जाती है। आमंत्रित करने के लिए अतिरिक्त विधि कॉल में थोड़ा प्रदर्शन प्रभाव पड़ता है क्योंकि यह एक अतिरिक्त विधि कॉल है। हॉटस्पॉट को इस कॉल के माध्यम से अनुकूलित करने में परेशानी होगी ... कम से कम सामान्य से अधिक। JITING बिल्कुल वही होता है।
संपादित करें 2: कुछ अतिरिक्त वस्तुओं है कि प्रतिबिंब के दौरान लोड किए गए हैं ... यह उल्लेख करते हुए
java.lang.Class बना सकते हैं और कैश विधि वस्तुओं (या फील्ड वस्तुओं, आदि) का उपयोग करने पर होगा। इन्हें सॉफ़्ट रेफरेंस में कैश किया जाता है और यदि स्मृति उपयोग की आवश्यकता होती है तो उसे फिर से दावा किया जाएगा।
हालांकि, इन वस्तुओं के प्रारंभिक अर्थ का अर्थ है कि इन विधि वस्तुओं के निर्माण का समर्थन करने के लिए वीएम द्वारा अतिरिक्त आंतरिक स्ट्रिंग लोड हो सकते हैं। मेरा अनुमान है कि ये तार पहले से ही प्रतिबिंबित वर्ग के निरंतर पूल का हिस्सा थे, लेकिन यह संभव है कि वे नहीं हैं। किसी भी तरह से, यह प्रति वर्ग प्रति विधि, प्रति वर्ग प्रति वर्ग इत्यादि पर एक बार हिट होता है .. विधियों तक पहुंचें, आपको कम से कम उन तरीकों के लिए सभी नाम मिलेंगे। फ़ील्ड तक पहुंचें, आपको इंटर्न के उन क्षेत्रों के नाम मिलेंगे। जब आप कोड है कि लोड नए वर्गों या तार भली होगा अमल
मुझे विश्वास है कि आप देख रहे हैं कि वहां नाम की खोज की जा रही है ताकि पहले से ही प्रशिक्षित विधि नामों पर '==' का उपयोग किया जा सके। (विश्वास नहीं है कि यह एक अच्छा विचार है।) चेहरे में, प्रतिबिंब कक्षाएं (कभी-कभी) बना सकता है। –
(वे इंटर्न वाले स्ट्रिंग्स कचरा संग्रहण चक्र पर पूर्ण के साथ जीसीबल हैं, कार्यान्वयन की अच्छी गुणवत्ता मानते हैं।) –
@ टॉम, क्या आप एक उदाहरण दे सकते हैं जहां प्रतिबिंब के कारण कक्षा बनाई जाती है? मैं दर्द होने की कोशिश नहीं कर रहा हूं, मैं वास्तव में इन मामलों के बारे में जानना चाहता हूं क्योंकि मैंने कभी नहीं देखा है। – PSpeed