Java में ClassLoader की क्या भूमिका है?



यह आलेख एक व्यापक मार्गदर्शिका है कि जावा में क्लासऑलडर कैसे काम करता है। यह Java में ClassLoader के प्रकारों, सिद्धांतों और विधियों पर चर्चा करता है।

जावा में काम करते समय, हम अक्सर बड़ी संख्या में कक्षाओं का उपयोग करते हैं। इन जावा कक्षाओं को मेमोरी में एक बार में लोड नहीं किया जाता है, इसके बजाय, उन्हें किसी एप्लिकेशन द्वारा आवश्यक होने पर लोड किया जाता है। यह वह जगह है जहाँ जावा क्लासलॉजर्स तस्वीर में आते हैं। इसलिए इस लेख में, मैं उदाहरण के साथ जावा में ClassLoader का उपयोग करने के तरीके के बारे में चर्चा करूंगा।

इस लेख में निम्नलिखित विषयों को शामिल किया जाएगा:





  1. ClassLoader क्या है?
  2. ClassLoader के प्रकार
  3. ClassLoader के सिद्धांत
  4. ClassLoader के तरीके
  5. कस्टम ClassLoader

हमें शुरू करने दो!

Java में ClassLoader क्या है?

Java में ClassLoader को जावा रनटाइम एनवायरनमेंट द्वारा डायनामिक रूप से क्लास में लोड करने के लिए कहा जाता है, जब भी आवेदन में आवश्यक हो जावा वर्चुअल मशीन । चूंकि ClassLoaders जावा रनटाइम एनवायरनमेंट का एक हिस्सा हैं, जावा वर्चुअल मशीन को अंतर्निहित फ़ाइलों और फ़ाइलों सिस्टम के बारे में कोई विचार नहीं होगा।



अब, आइए जावा में विभिन्न प्रकार के बिल्ट-इन क्लासलॉबर्स को समझते हैं।

लिनक्स पर हडूप कैसे स्थापित करें

Java में ClassLoader के प्रकार

जावा में विभिन्न प्रकार के ClassLoaders इस प्रकार हैं:

आइए हम उनमें से प्रत्येक पर एक-एक करके चर्चा करें।



एक्सटेंशन क्लासलाडर

जैसा कि नाम से पता चलता है कि एक्सटेंशन क्लासऑलरर कोर जावा कक्षाओं के एक्सटेंशन को लोड करता है JDK विस्तार पुस्तकालय। यह बूटस्ट्रैप क्लासलैडर का एक बच्चा है और JRE / lib / पाठ निर्देशिका या java.ext.dirs सिस्टम गुण में निर्दिष्ट किसी अन्य निर्देशिका से एक्सटेंशन लोड करता है।

आवेदन या सिस्टम क्लासऑलर

एप्लिकेशन या सिस्टम क्लासलोडर एक्सटेंशन क्लासअलाडर का एक बच्चा है। इस प्रकार का ClassLoader -cp कमांड-लाइन विकल्प में पाए जाने वाले सभी एप्लिकेशन स्तर की कक्षाओं को लोड करता है या CLASSPATIC नेटवर्क चर को इंटिग्रेट करता है।

बूटस्ट्रैप क्लासलोडर

जैसा कि हम सभी जानते हैं कि जावा क्लासेस के एक उदाहरण द्वारा लोड किए गए हैं java.lang.ClassLoade लेकिन, जब से ClassLoaders कक्षाएं हैं, बूटस्ट्रैप ClassLoader JDK आंतरिक कक्षाओं को लोड करने के लिए जिम्मेदार है। BootStrap ClassLoader एक मशीन कोड है जो JVM को कॉल करने और rt.jar से कक्षाओं को लोड करने पर ऑपरेशन शुरू करता है। तो, आप समझ सकते हैं कि बूटस्ट्रैप क्लासऑलडेर सर्व का कोई भी पैरेंट क्लासडैडर नहीं है और इस तरह इसे प्रिमोर्डियल क्लासलोआडर के रूप में जाना जाता है।

ध्यान दें: बूटस्ट्रैप की प्राथमिकता एक्सटेंशन से अधिक है, और एक्सटेंशन क्लासलोडर को दी गई प्राथमिकता एप्लिकेशन क्लासऑलर से अधिक है। नीचे दी गई छवि देखें:

ClassLoader के प्रकार - Java में ClassLoader - Edureka

इस लेख में आगे, आइए उन सिद्धांतों को समझते हैं जिन पर क्लासअलाडर काम करता है।

Java में ClassLoader के सिद्धांत

नियमों का सेट, जिसके आधार पर जावा क्लासलोडर काम करता है, निम्नलिखित तीन सिद्धांत हैं:

आइए हम उनमें से हर एक को समझें।

विशिष्टता संपत्ति

यह गुण यह सुनिश्चित करता है कि कक्षाओं की पुनरावृत्ति न हो और सभी वर्ग अद्वितीय हों। विशिष्टता की संपत्ति यह भी सुनिश्चित करती है कि माता-पिता द्वारा लोड की गई कक्षाएं क्लासलोडर चाइल्ड क्लासऑलर द्वारा लोड नहीं की जाती हैं। एक परिदृश्य में, जहाँ मूल ClassLoader वर्ग नहीं ढूँढ सकता है, तो वर्तमान आवृत्ति इसे स्वयं करने का प्रयास करेगी।

प्रतिनिधि मॉडल

डेलिगेशन मॉडल द्वारा दिए गए संचालन के सेट के आधार पर जावा कार्य में क्लासऑलर। इसलिए, जब भी किसी वर्ग या संसाधन को खोजने के लिए अनुरोध किया जाता है, तो एक ClassLoader उदाहरण कक्षा या संसाधन की खोज को पैरेंट क्लासलोडर को सौंप देगा।

संचालन का वह सेट जिसके आधार पर क्लासलोडर काम करता है:

  • जावा वर्चुअल मशीन यह जाँचती है कि कक्षा में लोड है या नहीं, जब भी वह कक्षा में आती है।
  • मामले में जहां कक्षा भरी हुई है जेवीएम वर्ग के निष्पादन के साथ आगे बढ़ता है, लेकिन ऐसे परिदृश्य में जहां कक्षा लोड नहीं होती है, तबJVM जावा क्लासलॉडर उप-प्रणाली को उस विशेष वर्ग को लोड करने के लिए कहता है। उसके बाद, ClassLoader उप-सिस्टम अनुप्रयोग ClassLoader को नियंत्रण देता है।
  • एप्लिकेशन क्लासअलाडर तब एक्सटेंशन क्लासअलाडर के अनुरोध को दर्शाता है, जो उसके बाद बूटस्ट्रैप क्लासलोडर के पास अनुरोध भेजता है।
  • अब, बूटस्ट्रैप ClassLoader में खोज करता हैयह जानने के लिए कि कक्षा उपलब्ध है या नहीं, बूटस्ट्रैप क्लासपाथ। यदि कक्षा उपलब्ध है, तो इसे लोड किया जाता है, अन्यथा अनुरोध फिर से एक्सटेंशन क्लासऑलर में पास किया जाता है।
  • एक्सटेंशन क्लासप्लाडर क्लास के लिए एक्सटेंशन क्लासपाथ में चेक करता है।यदि कक्षा उपलब्ध है, तो इसे लोड किया जाता है, अन्यथा अनुरोध फिर से क्लास क्लासडॉलर को भेज दिया जाता है।
  • अंत में, एप्लिकेशन क्लासप्लाडर एप्लिकेशन क्लासपाथ में कक्षा की खोज करता है।यदि कक्षा उपलब्ध है, तो भरी हुई है, अन्यथा आपको ClassNotFoundException का अपवाद दिखाई देगा।

नीचे दी गई छवि को देखें।

दृश्यता सिद्धांत

इस सिद्धांत के अनुसार, बच्चों की कक्षाएं उसके माता-पिता के क्लासऑलर द्वारा भरी कक्षाओं के लिए दिखाई देती हैं, लेकिन इसके विपरीत यह सच नहीं है। तो, एप्लिकेशन क्लासलोडर द्वारा लोड की गई कक्षाओं में एक्सटेंशन और बूटस्ट्रैप क्लासलोडर द्वारा लोड की गई कक्षाओं में दृश्यता है।

उदाहरण के लिए, यदि हमारे पास दो वर्ग हैं: A & B, मान लें कि कक्षा A को अनुप्रयोग ClassLoader द्वारा लोड किया गया है और Class B को एक्सटेंशन्स ClassLoader द्वारा लोड किया गया है। यहां, क्लास ए और बी उन सभी वर्गों के लिए दिखाई देते हैं, जो एप्लिकेशन क्लासलोडर द्वारा लोड किए गए हैं, लेकिन क्लास बी केवल एक्सटेंशन क्लासलोडर द्वारा लोड की गई उन कक्षाओं के लिए दिखाई देता है।

इसके अलावा, यदि आप बूटस्ट्रैप क्लासलोडर का उपयोग करके इन कक्षाओं को लोड करने का प्रयास करते हैं, तो आप देखेंगे java.lang.ClassNotFoundException । अपवाद।

ठीक है, अब जब आप क्लासओलिवर्स के प्रकार और इसके पीछे के सिद्धांतों को जानते हैं, तो आइए कुछ महत्वपूर्ण तरीकों पर ध्यान देंवहाँ से java.lang.ClassLoader कक्षा।

Java में ClassLoader के तरीके

कुछ आवश्यक ClassLoader के रूप में निम्नानुसार हैं:

loadClass (स्ट्रिंग नाम, बूलियन रिज़ॉल्यूशन)

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

ओवरलोडिंग और ओवरराइडिंग के बीच अंतर

घोषणा:

पब्लिक क्लास लोडक्लास (स्ट्रिंग नाम, बूलियन रिज़ॉल्यूशन) ClassNotFoundException {फेंकता है

डिफाइंडक्लास ()

एक अंतिम विधि एक वर्ग के उदाहरण के रूप में बाइट्स की एक सरणी को परिभाषित करने के लिए उपयोग की जाती है। यदि कक्षा अमान्य है, तो यह क्लासफ़ॉर्मेट एरर फेंकता है।

घोषणा:

संरक्षित अंतिम वर्ग डिफेंसक्लास (स्ट्रिंग नाम, बाइट [बी, इंट, ऑफ, इंट लेन) फेंकता है क्लासफ़ॉर्मर

findClass (स्ट्रिंग नाम)

FindClass विधि का उपयोग निर्दिष्ट वर्ग को खोजने के लिए किया जाता है। तो, यह केवल एक पैरामीटर के रूप में पूरी तरह से योग्य नाम के साथ वर्ग को ढूंढता है लेकिन कक्षा को लोड नहीं करता है। लोडक्लास () विधि इस विधि को लागू करती है यदि मूल ClassLoader अनुरोधित वर्ग को नहीं पा सकता है। इसके अलावा, यदि क्लासलोडर का कोई भी अभिभावक नहीं पाता है, तो क्लास डिफॉल्ट इम्प्लीमेंटेशन थ्रू ए वर्ग अपवाद में नहीं मिला।

घोषणा:

संरक्षित क्लास findClass (स्ट्रिंग नाम) ClassNotFoundException को फेंकता है

Class.forName (स्ट्रिंग नाम, बूलियन इनिशियलाइज़, क्लासलोडर लोडर)

इस पद्धति का उपयोग कक्षा को लोड करने और आरंभ करने के लिए किया जाता है। यह किसी भी ClassLaders का चयन करने के लिए एक विकल्प देता है और ClassLoader पैरामीटर को असंगत कर देता है NULL, फिर स्वचालित रूप से बूटस्ट्रैप ClassLoader का उपयोग किया जाता है।

घोषणा:

सार्वजनिक स्थिर वर्ग forName (स्ट्रिंग नाम, बूलियन इनिशियलाइज़, ClassLoader लोडर) ClassNotoundException को फेंकता है

getParent ()

GetParent विधि का उपयोग प्रतिनिधिमंडल के लिए मूल ClassLoader को वापस करने के लिए किया जाता है।

घोषणा:

सार्वजनिक अंतिम ClassLoader getParent ()

getResource ()

जैसा कि नाम से पता चलता है, getResource () विधि में दिए गए नाम के साथ एक संसाधन खोजने की कोशिश की गई है। यह प्रारंभ में संसाधन के लिए मूल ClassLoader के अनुरोध को सौंप देगा। यदि माता-पिता अशक्त हैं, तो जेवीएम में निर्मित क्लासलैडर का रास्ता खोजा जाता है। अब, यदि यह विफल रहता है, तो विधि संसाधन खोजने के लिए findResource (String) को आमंत्रित करेगी, जहाँ संसाधन नाम को एक इनपुट के रूप में निर्दिष्ट किया जाता है जो या तो निरपेक्ष या सापेक्ष classpath हो सकता है। फिर, यह संसाधन को पढ़ने के लिए एक URL ऑब्जेक्ट देता है या एक शून्य मान देता है यदि संसाधन के पास संसाधन को वापस करने के लिए पर्याप्त विशेषाधिकार नहीं है या नहीं मिला है।

घोषणा:

सार्वजनिक URL getResource (स्ट्रिंग नाम)

इसके बाद, Java में ClassLoader के इस लेख में, चलिए Custom ClassLoader को समझते हैं।

जावा में कस्टम क्लासलॉडर

बिल्ट-इन ClassLoaders अधिकांश मामलों का ध्यान रखेगा जहाँ फाइलें पहले से ही फाइल सिस्टम में हैं, लेकिन यदि आप कक्षाओं को स्थानीय हार्ड ड्राइव से लोड करना चाहते हैं, तो आपको कस्टम ClassLoaders का उपयोग करने की आवश्यकता है।

कस्टम ClassLoader बनाएँ

एक कस्टम ClassLoader बनाने के लिए, आपको विस्तार करना होगा क्लासरूम वर्ग और ओवरराइड findClass () तरीका:

उदाहरण: आइए हम एक कस्टम क्लासऑलाडर बनाते हैं जो डिफॉल्ट क्लासेलेडर का विस्तार करता है और निर्दिष्ट फ़ाइल से एक बाइट सरणी लोड करता है। नीचे दिए गए कोड को देखें।

पैकेज edureka import java.io.ByteArrayOutputStream आयात java.io.ile आयात java.io.ioException इंपोर्ट java.io.InputStream पब्लिक क्लास का नमूना ClassLoader (@Override public Class findClass (String samplename)) को “ClassNotFoundException” {byte} के द्वारा बढ़ाता है। (samplename) रिटर्न डिफाइंडक्लास (samplename, b, 0, b.length)} प्राइवेट बाइट [] customLoadClassFromFile (स्ट्रिंग demofilename) {InputStream inStream (getClass ()। getClassLoader ()-getResourceAsStream (डेमोफिल्लेम)। विभाजकचोर) + '.class') बाइट [] बफ़र ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 कोशिश {{(अगला nextalalue = inStream.read ())! = -1) {bStream.write (nextValue) पकड़ (IOException e) {e.printStackTrace ()} बफ़र = bStream.toByteArray () बफ़र}}

इसके साथ, हम Java में ClassLoader के इस लेख के अंत में आते हैं। मुझे उम्मीद है कि आप समझ गए होंगे कि Java में ClassLoaders क्या है, इसके तरीके, विभिन्न प्रकार के ClassLoaders इत्यादि।

यदि आपको यह लेख 'जावा में ClassLoader' पर मिला है, तो देखें 250,000 से अधिक संतुष्ट शिक्षार्थियों के एक नेटवर्क के साथ एक विश्वसनीय ऑनलाइन शिक्षण कंपनी, एडुरेका द्वारा, दुनिया भर में फैली हुई है। हम यहां आपकी यात्रा में हर कदम पर आपकी मदद करने के लिए हैं, इस साक्षात्कार साक्षात्कार के अलावा बनने के लिए, हम एक पाठ्यक्रम के साथ आते हैं, जो छात्रों और पेशेवरों के लिए डिज़ाइन किया गया है जो एक बनना चाहते हैं जावा डेवलपर।

क्या आप हमसे कोई प्रश्न पूछना चाहते हैं? कृपया इसे जावा में इस 'ClassLoader के टिप्पणी अनुभाग में उल्लेख करें ' और हम जितनी जल्दी हो सके आप को वापस मिल जाएगा।