2014-04-07 8 views
6

आज मैं सोच रहा था कि संकलन/अनुप्रयोग स्टार्टअप के दौरान कोड जनरेशन के बजाय 'हाइबरनेट उपयोग प्रतिबिंब' जैसे फ्रेमवर्क (उदाहरण के लिए BCEL या ASM जैसे पुस्तकालयों का उपयोग करना)।जावा प्रतिबिंब बनाम कोड पीढ़ी

क्या यह ऐतिहासिक कारणों से है (जब Hibernate लिखा जा रहा था, ऐसी कोई लाइब्रेरी उपलब्ध नहीं थी जो फ्लाई पर बाइट कोड पीढ़ी की अनुमति देगी) और अब हर कोई इस दृष्टिकोण का उपयोग करता है?

मुझे लगता है कि जेनरेट कोड के साथ दृष्टिकोण तेजी से होगा जो प्रतिबिंब का उपयोग करता है।

+1

प्रतिबिंब धीमा नहीं है, विशेष रूप से I/O - डेटाबेस/फ़ाइल एक्सेस के संदर्भ में परिमाण धीमे होने के कई आदेश होंगे जो प्रदर्शन प्रतिबिंब के कारण प्रभावित होते हैं। – assylias

+0

हाँ, आप शायद सही हैं। मैंने अभी इस सवाल से पूछा क्योंकि मैं प्रतिबिंब का उपयोग करने के फैसले के बारे में उत्सुक था। जेवीएम के इतने सालों के बाद मुझे विश्वास है कि कई अनुकूलन हैं जो 'जावा' की पहली रिलीज की तुलना में प्रतिबिंब को तेज करते हैं। – Andna

उत्तर

6

दाएं, Hibernate संभवतः कोड पीढ़ी से लाभ हो सकता है, हालांकि लाभ आपके जैसा लगता है उतना बड़ा नहीं हो सकता है।

  1. सबसे पहले, प्रतिबिंब हुड के नीचे बाइटकोड पीढ़ी का उपयोग करता है और यह बहुत धीमी नहीं है।
  2. आप केवल बाइटकोड पीढ़ी का उपयोग करके कुछ प्रकार की चीजें नहीं कर सकते हैं। जैसे प्रतिबिंब आपको निजी क्षेत्रों तक पहुंचने और निजी तरीकों का आह्वान करने की अनुमति देता है, जबकि बाइटकोड पीढ़ी के साथ यह संभव नहीं है (जब तक आप certain non-portable hacks का उपयोग नहीं करते)।
+0

विज्ञापन। 1 - क्या आपके पास इस पर कोई स्रोत है (कोड पीढ़ी मेरा मतलब है)? मैंने वास्तव में कभी नहीं पढ़ा कि कैसे प्रतिबिंब हुड के नीचे काम करता है। अगर आप मुझे कुछ लेख में इंगित कर सकते हैं तो मुझे खुशी होगी। विज्ञापन। 2 - सच, प्रतिबिंब के लिए बिंदु – Andna

+2

[प्रतिबिंब स्रोत] पर एक नज़र डालें (http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/43cb25339b55/src/share/classes/sun/reflect) में ओपनजेडीके, विशेष रूप से 'MethodAccessorGenerator.java'। संक्षेप में, 'java.lang.Method' में एक एक्सेसर है जिसमें आमंत्रण का प्रतिनिधि होता है। 'Method.invoke()' की पहली 15 कॉल JVM द्वारा मूल कॉल के माध्यम से निष्पादित की जाती हैं (देखें 'मूल MethodAccessorImpl.java')। फिर, जैसे ही 'sun.reflect.inflationTreshold' तक पहुंच जाता है (डिफ़ॉल्ट रूप से 15), बाइटकोड पीढ़ी रन और 'NativeMethodAccessorImpl' को गतिशील रूप से जेनरेट किए गए जावा एक्सेसर के साथ प्रतिस्थापित किया जाता है। – apangin

+0

प्रासंगिक स्रोतों को जोड़ने के लिए धन्यवाद। – Andna

संबंधित मुद्दे