2011-03-29 6 views
9

मैंने प्रलेखन पढ़ा है, लेकिन मुझे अभी भी समझ में नहीं आता कि मुझे कौन से क्लासलोडर को तर्क के रूप में आपूर्ति करनी चाहिए। मैंने कुछ विकल्पों की कोशिश की है, लेकिन ऐसा लगता है कि यह संकलन या प्रॉक्सी के व्यवहार पर कोई प्रभाव नहीं पड़ता है। यह थोड़ा परेशान है कि मैं वर्ग लोडर तर्क के रूप में कुछ भी पास कर सकता हूं, जिसमें null शामिल है, और कोड अभी भी ठीक काम करता है। क्या कोई इसे समझा सकता है, और मुझे बता सकता है कि अगर मैं क्लासलोडर के लिए गलत तर्क देता हूं तो किस प्रकार की त्रुटियां उत्पन्न हो सकती हैं? मुझे यह जोड़ना चाहिए कि जावा में या सामान्य रूप से क्लासलोडर क्या है, उसके बारे में मेरे पास वास्तव में एक मजबूत अंतर्ज्ञानी विचार नहीं है।मुझे कौन से क्लासलोडर को प्रॉक्सी.न्यूप्रोक्सी इंस्टेंस (...) में आपूर्ति करनी चाहिए?

उत्तर

6

किसी भी वर्ग को क्लासलोडर होना चाहिए, इस प्रकार हमें यहां एक देना होगा।

इंटरफ़ेस प्रकार के सभी निर्दिष्ट वर्ग लोडर के माध्यम से नाम से दिखाई देना चाहिए:

महत्वपूर्ण हिस्सा यह (the documentation for getProxyClass() में) है। दूसरे शब्दों में, वर्ग लोडर सीएल और हर इंटरफ़ेस मैं के लिए , निम्नलिखित अभिव्यक्ति सच होना चाहिए:

Class.forName(i.getName(), false, cl) == i 

तो, आप किसी भी classloader जहां एक (या अधिक) अपनी मूल classloaders की दी गई परिभाषित उपयोग कर सकते हैं इंटरफेस।

यदि null आपके मामले में काम करता है, तो मुझे लगता है कि आपके इंटरफेस में null क्लास लोडर (बूटस्ट्रैप लोडर) भी है - तो इससे कोई फ़र्क नहीं पड़ता कि आपने किस क्लासलोडर का उपयोग किया था। यदि आपको इंटरफेस से प्रॉक्सी बनाना है, तो आप नहीं जानते हैं, बस दिए गए पहले इंटरफेस का क्लासलोडर लें और उम्मीद करें कि आपके कॉलर ने कुछ अजीब नहीं किया है।

इसकी आवश्यकता क्यों है?

आप इस तरह यह कल्पना कर सकते हैं:

  • getProxyClass() विधि बनाता है एक नया वर्ग अपने सभी इंटरफेस के सभी तरीकों को लागू करने के लिए (अगर यह अभी तक मौजूद नहीं है) कुछ बाईटकोड (उनमें से प्रत्येक बस अग्रेषण आपके InvocationHandler पर कॉल)।
  • फिर यह निर्दिष्ट किया गया क्लासलोडर के defineClass विधि पर इस बाइटकोड को पास करता है।
  • इस बाइटकोड में, आपके सभी इंटरफेस को नाम से संदर्भित किया जाता है, और वीएम अब इन इंटरफेस को हल करने के लिए उद्धृत forName कॉल का उपयोग करता है।

हम इस getProxyClass इस तरह से शुद्ध जावा में किसी भी वीएम जादू के बिना इसके लिए बजाय एक मौजूदा पुन: उपयोग करने में सक्षम होने के कार्यान्वित किया जा सकता था, लेकिन हम (निर्दिष्ट एक एक अभिभावक के रूप के साथ) एक नया classloader बनाने के लिए की आवश्यकता होगी एक।

हकीकत में वहाँ, इस सिंथेटिक वर्ग के लिए एक वास्तविक बाईटकोड नहीं हो सकता है के बाद से वीएम :-)

+0

धन्यवाद यहाँ अपने आंतरिक जादू का उपयोग करने में सक्षम है, मैं अभी भी क्या एक classloader करता है के लिए अंतर्ज्ञान की जरूरत नहीं है । क्या आप इसके बारे में थोड़ा सा उल्लेख कर सकते हैं? मुझे अभी भी समझ में कठिनाई हो रही है कि क्लासलोडर कुछ भी करने के लिए ज़िम्मेदार होने पर एक नल क्लासलोडर संभवतः क्यों काम कर सकता है। शायद एक खिलौना उदाहरण जहां एक गलत क्लासलोडर दिया जाता है? – jonderry

+0

'शून्य' क्लासलोडर "बूटस्ट्रैप क्लासलोडर" है, क्लासलोडर जो कोर क्लास (जैसे 'क्लास', 'ऑब्जेक्ट', 'क्लासलोडर') लोड करता है। इसे वीएम द्वारा मूल रूप से लागू किया गया है और इसमें क्लासलोडर ऑब्जेक्ट नहीं है। (इसका उपयोग कक्षा द्वारा किया जाता है।forName' अगर आप 'null' को 'क्लासलोडर' तर्क के रूप में देते हैं, उदाहरण के लिए)। (उदाहरण बाद में आ जाएगा।) –

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