2011-03-25 16 views
6

loadClass(String name) और loadClass(String name, boolean resolve) के बीच क्या अंतर है?loadClass (स्ट्रिंग नाम) और लोड क्लास (स्ट्रिंग नाम, बूलियन संकल्प) के बीच अंतर

मुझे पता है कि केवल एक ही अंतर loadClass(String name, boolean resolve) कॉल ढूंढता है लोडेड क्लास (स्ट्रिंग) यदि resolve पैरामीटर सत्य है?

तो जब सत्य या गलत resolve पैरामीटर पर पारित किया गया है?
मैं इन दो कार्यों के बीच बहुत उलझन में हूं।

धन्यवाद।

उत्तर

3

संकल्प पैरामीटर नियंत्रित करता है कि लोड की गई कक्षा को लिंक किया गया है या नहीं। लिंकिंग के दौरान, स्थिर स्थिरांक प्रारंभ किए जाते हैं और उनकी स्मृति आवंटित की जाती है। इसके अतिरिक्त, कक्षा को शुद्धता के लिए सत्यापित किया गया है, और संभावित रूप से अन्य वर्गों के लिंक हल किए जाएंगे।

यह उपयोगी हो सकता है, उदाहरण के लिए, यदि आप एक नई कक्षा में लोड करना चाहते हैं जो विकृत हो सकता है और यह नहीं चाहता कि जेवीएम उस स्थिति में सत्यापन त्रुटियों को फेंक दे, जो वर्ग खराब है।

1

कक्षा पहले से उपयोग की जाने वाली किसी भी तरह से जुड़ी हुई है (या कम से कम उपयोग किए गए हिस्सों) - resolve ध्वज के साथ आप VM को बाद में इसके बजाय इस लिंकिंग (और प्रासंगिक त्रुटियों को फेंकने) का कारण बन सकते हैं।

1

आप कोशिश कर सकते हैं।

public class Test3 { 

    static{ 
     new Test(); 
    } 
} 

संकलन के बाद, एक interface.but करने के लिए एक ठोस वर्ग से टेस्ट कक्षा बदलने के एक ठोस कक्षा Test.Then को test3 लिंक रहने यदि संकल्प गलत है, JVM इस error.It के बहुत ही दिलचस्प नहीं मिलेगा। असल में, Class someClass1= Class.forName("Test3",false,cls) टेस्ट 3 को हल नहीं करेगा, इसका मतलब है कि कोई त्रुटि नहीं फेंक दी जाएगी।

लेकिन यदि आप उप क्लास या Class.forName("Test3") में सही हल करते हैं, तो रनटाइम में JVM क्लास लिंक त्रुटि मिलेगा।

आपके संदर्भ के लिए, जावा भाषा विशिष्टता - 12.3 Linking of Classes and Interfaces समझाने क्या resolveClass करता है। वर्ग और इंटरफेस की

12,3 लिंकिंग लिंकिंग कक्षा या इंटरफ़ेस प्रकार की एक बाइनरी रूप ले और जावा आभासी मशीन के क्रम राज्य में यह संयोजन, इतना है कि यह क्रियान्वित किया जा सकता की प्रक्रिया है। एक वर्ग या इंटरफ़ेस प्रकार हमेशा लिंक होने से पहले लोड किया जाता है। लिंक करने में तीन अलग-अलग गतिविधियां शामिल हैं: प्रतीकात्मक संदर्भों का सत्यापन, तैयारी और संकल्प। जावा वर्चुअल मशीन विशिष्टता, द्वितीय संस्करण के अध्याय 5 में लिंकिंग के सटीक अर्थशास्त्र दिए गए हैं। यहां हम जावा प्रोग्रामिंग भाषा के दृष्टिकोण से प्रक्रिया का एक अवलोकन प्रस्तुत करते हैं।

12.3.3 प्रतीकात्मक संदर्भ का संकल्प क्लास अथवा अंतरफलक संदर्भ अन्य वर्गों और इंटरफेस और अपने खेतों, विधियों, और कंस्ट्रक्टर प्रतीकात्मक की बाइनरी प्रतिनिधित्व, अन्य वर्गों और इंटरफेस की बाइनरी नाम (§13.1) का उपयोग (§13.1)। फ़ील्ड और विधियों के लिए, इन प्रतीकात्मक संदर्भों में वर्ग या इंटरफ़ेस प्रकार का नाम शामिल है जो उपयुक्त प्रकार की जानकारी के साथ फ़ील्ड या विधि के साथ-साथ फ़ील्ड या विधि का नाम घोषित करता है। एक प्रतीकात्मक संदर्भ का उपयोग करने से पहले इसे संकल्प से गुजरना चाहिए, जिसमें एक प्रतीकात्मक संदर्भ सही होने के लिए चेक किया गया है और, आमतौर पर, प्रत्यक्ष संदर्भ के साथ प्रतिस्थापित किया जाता है जिसे संदर्भ बार-बार उपयोग किया जाता है, तो अधिक कुशलता से संसाधित किया जा सकता है।

यदि समाधान के दौरान कोई त्रुटि होती है, तो एक त्रुटि फेंक दी जाएगी। आमतौर पर, यह कक्षा असंगत क्लास चेंजएरर के निम्न उपखंडों में से एक का उदाहरण होगा, लेकिन यह असंगत क्लास चेंज एरर के किसी अन्य उप-वर्ग का भी उदाहरण हो सकता है या यहां तक ​​कि क्लास असंपेबल क्लास चेंज एरर का एक उदाहरण भी हो सकता है। , या मंगलाचरण एक प्रतीकात्मक संदर्भ का सामना करना पड़ा गया है कि एक प्रयोग है या एक क्षेत्र का काम करता है: यह त्रुटि, कार्यक्रम प्रकार के लिए एक प्रतीकात्मक संदर्भ का उपयोग करता है में किसी भी बिंदु पर फेंक दिया जा सकता है प्रत्यक्ष या परोक्ष रूप:

IllegalAccessError किसी विधि का, या किसी वर्ग के उदाहरण का निर्माण, जिसमें संदर्भ वाले कोड में पहुंच नहीं है क्योंकि फ़ील्ड या विधि को निजी, संरक्षित, या डिफ़ॉल्ट पहुंच (सार्वजनिक नहीं) घोषित किया गया था, या क्योंकि कक्षा घोषित नहीं की गई थी जनता। यह हो सकता है, उदाहरण के लिए, यदि मूल रूप से घोषित किया गया फ़ील्ड किसी अन्य वर्ग के बाद निजी हो जाता है जो फ़ील्ड को संदर्भित करता है (§13.4.6)।

InstantiationError: एक प्रतीकात्मक संदर्भ कि आ गई एक वर्ग उदाहरण निर्माण अभिव्यक्ति में प्रयोग किया जाता है, लेकिन क्योंकि संदर्भ पता चला है एक इंटरफेस करने के लिए या एक अमूर्त वर्ग का उल्लेख करने के एक उदाहरण नहीं बनाया जा सकता। यह हो सकता है, उदाहरण के लिए, यदि मूल रूप से सार नहीं है, तो एक वर्ग के बाद सारणी को संदर्भित किया गया है जो प्रश्न में वर्ग को संदर्भित किया गया है (§13.4.1)।

NoSuchFieldError: एक प्रतीकात्मक संदर्भ का सामना करना पड़ा गया है कि एक विशिष्ट वर्ग या अंतरफलक के किसी विशिष्ट क्षेत्र के लिए संदर्भित करता है, लेकिन वर्ग या इंटरफ़ेस है कि नाम के एक क्षेत्र शामिल नहीं है। यह हो सकता है, उदाहरण के लिए, यदि किसी वर्ग के बाद किसी वर्ग से फ़ील्ड घोषणा हटा दी गई थी जो फ़ील्ड को संदर्भित करती है (§13.4.7)।

NoSuchMethodError: एक प्रतीकात्मक संदर्भ का सामना किया गया है जो किसी विशिष्ट वर्ग या इंटरफ़ेस की विशिष्ट विधि को संदर्भित करता है, लेकिन कक्षा या इंटरफ़ेस में उस हस्ताक्षर की विधि नहीं है। यह हो सकता है, उदाहरण के लिए, यदि किसी अन्य वर्ग के बाद किसी वर्ग से विधि घोषणा को हटा दिया गया था जो विधि को संदर्भित किया गया था (§13.4.11)। इसके अतिरिक्त, असंतुष्ट LinkError (का उप-वर्ग) LinkageError) यदि कोई वर्ग मूल विधि घोषित करता है जिसके लिए कोई कार्यान्वयन नहीं मिल सकता है तो उसे फेंक दिया जा सकता है। वर्चुअल मशीन (§12.3) द्वारा किस तरह की रिज़ॉल्यूशन रणनीति का उपयोग किया जा रहा है, इस पर निर्भर करता है कि विधि का उपयोग किया जाता है या इससे पहले त्रुटि होगी।

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

  • कोई संबंधित समस्या नहीं^_^