Java ClassLoader क्या है?


174

कुछ सरल वाक्यों में, Java ClassLoader क्या है, इसका उपयोग कब और क्यों किया जाता है?

ठीक है, मैंने एक विकी लेख पढ़ा। ClassLoader कक्षाओं को लोड करता है। ठीक है। इसलिए अगर मैं जार फाइलें और आयात शामिल करता हूं, तो एक ClassLoader काम करता है।

मुझे इस क्लास-बॉलर से क्यों परेशान होना चाहिए? मैंने इसका कभी उपयोग नहीं किया है और यह नहीं जानता कि यह अस्तित्व में है।

सवाल यह है कि क्लास-क्लास का अस्तित्व क्यों है? और यह भी, कि आप इसे व्यवहार में कैसे उपयोग करते हैं? (मामले मौजूद हैं, मुझे पता है।)


यदि आप अपने प्रश्न को छोटा करते हैं, तो आप बेहतर परिणाम प्राप्त करेंगे, उदाहरण के लिए, एक विशिष्ट भाग की ओर इशारा करते हुए, जिसे आप नहीं समझते हैं, यह किसी अन्य भाषा से संबंधित है, जिससे आप परिचित हैं, आदि
JRL

75
यह एक पूरी तरह से उचित सवाल है, जब अवधारणा को समझाने के लिए कुछ सरल वाक्यों की खोज करने वाले किसी व्यक्ति के परिप्रेक्ष्य से देखा जाता है
oxbow_lakes

जवाबों:


231

सूर्य से इस अच्छे ट्यूटोरियल से लिया गया :

प्रेरणा

सी और सी ++ जैसे सांख्यिकीय रूप से संकलित प्रोग्रामिंग भाषाओं में लिखे गए एप्लिकेशन को मूल, मशीन-विशिष्ट निर्देशों में संकलित किया जाता है और एक निष्पादन योग्य फ़ाइल के रूप में सहेजा जाता है। एक निष्पादन योग्य मूल कोड में कोड को जोड़ने की प्रक्रिया को लिंकिंग कहा जाता है - एक निष्पादन योग्य एप्लिकेशन बनाने के लिए साझा लाइब्रेरी कोड के साथ अलग संकलित कोड का विलय। यह जावा जैसे गतिशील रूप से संकलित प्रोग्रामिंग भाषाओं में अलग है। जावा में, जावा कंपाइलर द्वारा उत्पन्न .class फाइलें तब तक रहती हैं, जब तक कि जावा वर्चुअल मशीन (JVM) में लोड नहीं हो जाती - दूसरे शब्दों में, लिंकिंग प्रक्रिया JVM द्वारा रनटाइम पर की जाती है। कक्षाओं को 'आवश्यकतानुसार' के आधार पर JVM में लोड किया जाता है। और जब एक लोडेड क्लास दूसरी क्लास पर निर्भर करता है, तो उस क्लास को भी लोड किया जाता है।

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

इस पुनरावर्ती वर्ग लोडिंग की भावना के साथ-साथ सामान्य रूप से क्लास लोडिंग विचार प्राप्त करने के लिए, निम्नलिखित सरल वर्ग पर विचार करें:

public class HelloApp {
   public static void main(String argv[]) {
      System.out.println("Aloha! Hello and Bye");
   }
}

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

prmpt>java -verbose:class HelloApp



[Opened C:\Program Files\Java\jre1.5.0\lib\rt.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jsse.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\jce.jar]
[Opened C:\Program Files\Java\jre1.5.0\lib\charsets.jar]
[Loaded java.lang.Object from shared objects file]
[Loaded java.io.Serializable from shared objects file]
[Loaded java.lang.Comparable from shared objects file]
[Loaded java.lang.CharSequence from shared objects file]
[Loaded java.lang.String from shared objects file]
[Loaded java.lang.reflect.GenericDeclaration from shared objects file]
[Loaded java.lang.reflect.Type from shared objects file]
[Loaded java.lang.reflect.AnnotatedElement from shared objects file]
[Loaded java.lang.Class from shared objects file]
[Loaded java.lang.Cloneable from shared objects file]
[Loaded java.lang.ClassLoader from shared objects file]
[Loaded java.lang.System from shared objects file]
[Loaded java.lang.Throwable from shared objects file]
.
.
.
[Loaded java.security.BasicPermissionCollection from shared objects file]
[Loaded java.security.Principal from shared objects file]
[Loaded java.security.cert.Certificate from shared objects file]
[Loaded HelloApp from file:/C:/classes/]
Aloha! Hello and Bye
[Loaded java.lang.Shutdown from shared objects file]
[Loaded java.lang.Shutdown$Lock from shared objects file]

जैसा कि आप देख सकते हैं, एप्लिकेशन रन (HelloApp) द्वारा आवश्यक जावा रनटाइम कक्षाएं पहले भरी हुई हैं।

जावा 2 प्लेटफॉर्म में क्लास लोडर

जावा प्रोग्रामिंग भाषा रोज़ाना डेवलपर्स के जीवन को आसान बनाने के लिए विकसित होती रहती है। यह एपीआई प्रदान करके किया जाता है जो आपको मौलिक तंत्रों के कार्यान्वयन के विवरण के बजाय व्यावसायिक तर्क पर ध्यान केंद्रित करने की अनुमति देकर आपके जीवन को सरल बनाता है। जावा प्लेटफॉर्म की परिपक्वता को दर्शाने के लिए जे 2 एसई 1.5 से जे 2 एसई 5.0 के हालिया परिवर्तन से यह स्पष्ट होता है।

JDK 1.2 के रूप में, एक बूटस्ट्रैप क्लास लोडर जो JVM में बनाया गया है, जावा टाइमटाइम की कक्षाओं को लोड करने के लिए जिम्मेदार है। यह क्लास लोडर केवल उन कक्षाओं को लोड करता है जो बूट क्लासपाथ में पाए जाते हैं, और चूंकि ये विश्वसनीय वर्ग हैं, इसलिए मान्यता प्राप्त प्रक्रिया को अविश्वसनीय वर्गों के लिए नहीं किया जाता है। बूटस्ट्रैप क्लास लोडर के अलावा, जेवीएम में एक एक्सटेंशन क्लास लोडर है जो स्टैंडर्ड एक्सटेंशन एपीआई से लोडिंग क्लास के लिए जिम्मेदार है, और एक सिस्टम क्लास लोडर जो सामान्य क्लास पथ के साथ-साथ आपके एप्लिकेशन क्लासेस से लोड करता है।

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

Java.lang.ClassLoader क्लास

java.lang.ClassLoaderएक अमूर्त वर्ग है कि आवेदन पत्र जो JVM गतिशील भार वर्गों में ढंग का विस्तार करने की जरूरत है कि द्वारा subclassed जा सकता है। java.lang.ClassLoader(और उसके उपवर्गों) में कंस्ट्रक्टर आपको एक माता-पिता को निर्दिष्ट करने की अनुमति देते हैं जब आप एक नए क्लास लोडर को तुरंत भेजते हैं। यदि आप स्पष्ट रूप से माता-पिता को निर्दिष्ट नहीं करते हैं, तो वर्चुअल मशीन के सिस्टम क्लास लोडर को डिफ़ॉल्ट माता-पिता के रूप में सौंपा जाएगा। दूसरे शब्दों में, क्लास और संसाधनों की खोज के लिए क्लासलैडर क्लास एक प्रतिनिधिमंडल मॉडल का उपयोग करता है। इसलिए, ClassLoader के प्रत्येक उदाहरण में एक संबंधित पैरेंट क्लास लोडर होता है, ताकि जब किसी वर्ग या संसाधनों को खोजने का अनुरोध किया जाए, तो कार्य को कक्षा या संसाधन को खोजने का प्रयास करने से पहले अपने मूल वर्ग लोडर को सौंप दिया जाता है। loadClass()क्लासलोडर की विधि निम्नलिखित कार्यों को करती है, जब एक कक्षा को लोड करने के लिए कहा जाता है:

यदि कोई वर्ग पहले ही लोड हो चुका है, तो वह उसे लौटा देता है। अन्यथा, यह मूल वर्ग लोडर के लिए नए वर्ग की खोज को दर्शाता है। यदि पैरेंट क्लास लोडर क्लास को नहीं खोजता है, तो क्लास को खोजने और लोड करने के लिए loadClass()विधि findClass()को कॉल करता है । finalClass()वर्तमान वर्ग लोडर में वर्ग के लिए विधि खोज वर्ग माता पिता वर्ग लोडर से नहीं मिला था यदि।


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


47

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

क्लास-लाईटर्स का उपयोग बड़े सिस्टम और सर्वर एप्लिकेशन में किया जाता है जैसे कि:

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

29

सवाल यह है कि "इस क्लासऑलडर वर्ग का अस्तित्व क्यों है?"

ठीक है, ज्यादातर तो आप चीजों को ठीक कर सकते हैं अगर वे गलत हो जाते हैं :-)।

यह सच है, जब तक आप सिर्फ एक आवेदन लिखते हैं, इसे एक JAR में संकलित करते हैं और शायद कुछ अतिरिक्त लाइब्रेरी JAR शामिल करते हैं, आपको क्लास लोडर के बारे में जानने की आवश्यकता नहीं है, यह बस काम करेगा।

फिर भी, यह समझने में मदद करता है कि क्लास लोडर और क्लास लोडिंग के बारे में थोड़ा समझने के लिए कि पर्दे के पीछे क्या होता है। एक उदाहरण के रूप में, "स्टैटिक इनिशियलाइज़र" एक क्लास लोड होने पर चलेगा, इसलिए यह समझने के लिए कि वे कब चलेंगे, आपको यह जानना होगा कि क्लास लोडर उन्हें लोड करने के समय कैसे तय करता है।

भी .. आप इसे व्यवहार में कैसे उपयोग करते हैं?

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


14

ClassLoaderजावा में एक वर्ग है जो जावा में वर्ग फ़ाइलों को लोड करने के लिए उपयोग किया जाता है। जावा कोड को javacकंपाइलर द्वारा क्लास फ़ाइल में संकलित किया जाता है और जेवीएम जावा प्रोग्राम को निष्पादित करता है, क्लास फाइल में लिखे बाइट कोड को निष्पादित करके।

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

classloader


ClassLoader कैसे काम करता है

जेवीएम के साथ ## क्लासमैडर बातचीत यहां छवि विवरण दर्ज करें

अधिक @: how-classloader-works-in-java.html


6

क्लास लोडर JVM का एक कार्यात्मक घटक है, जो '.class' फ़ाइल से या ढेर में विधि क्षेत्र में नेटवर्क से क्लास डेटा लोड करता है।

जेवीएम का एक अभिन्न अंग की तरह दिखता है, लेकिन एक अंतिम जावा उपयोगकर्ता के रूप में मुझे चिंतित क्यों होना चाहिए? यहाँ क्यों है:

प्रत्येक वर्ग लोडर में अपना नाम स्थान होता है और एक विशेष वर्ग लोडर द्वारा आह्वान की गई कक्षाएं नाम स्थान में हो जाती हैं।

दो अलग-अलग वर्ग लोडरों द्वारा आह्वान किए गए वर्गों में एक दूसरे पर दृश्यता नहीं होगी, जिसके परिणामस्वरूप सुरक्षा बढ़ाई जाएगी।

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

जानकारी के लिए यहां देखें


1

कक्षा लोडर श्रेणीबद्ध हैं। कक्षाएं JVM से शुरू की जाती हैं क्योंकि वे उस वर्ग में नाम से संदर्भित हैं जो पहले से ही JVM में चल रहा है।

बहुत पहले वर्ग को कैसे लोड किया गया? आपकी कक्षा में घोषित विधि
की सहायता से बहुत पहले वर्ग को लोड किया जाता है static main()। बाद के सभी लोड किए गए वर्गों को कक्षाओं द्वारा लोड किया जाता है, जो पहले से लोड और चल रहे हैं।

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

बूटस्ट्रैप (प्राइमर्डियल) यह क्लास लोडर फिर से लोड करने योग्य नहीं है। लोड JDK आंतरिक कक्षाएं, जावा। * पैकेज (आमतौर पर rt.jar और i18n.jar लोड करता है)। विस्तार यह वर्ग लोडर फिर से लोड करने योग्य नहीं है। JDK एक्सटेंशन डायरेक्टरी (आमतौर पर JRE के लिब / एक्ज़क्यूटिव) से लोअर जार फाइलें। सिस्टम यह क्लास लोडर पुनः लोड करने योग्य नहीं है। सिस्टम क्लास पथ से भार वर्ग।

http://www.sbalasani.com/2015/01/java-class-loaders.html


1

जब आप पूछते हैं कि क्‍लासॉल्‍डर क्‍लास क्‍यों मौजूद है, तो इसका कारण बहुत सरल है - क्‍लास समय पर क्‍लास फाइल खोजने और लोड करने के लिए जिम्‍मेदार है ।

आइए इसे विस्तृत करें।

जेवीएम में, हर वर्ग किसी न किसी उदाहरण से भरा हुआ है java.lang.ClassLoader। जब भी कोई नया JVM आपके द्वारा सामान्य रूप से जावा प्रोग्राम लॉन्चिंग java <classname>कमांड के द्वारा शुरू किया जाता है , तो पहला कदम उचित कामकाजी java.lang.Objectऔर अन्य रनटाइम कक्षाओं ( rt.jar) के लिए आवश्यक सभी प्रमुख वर्गों को मेमोरी में लोड करना है ।

अब, वास्तव में ClassLoader के 3 भाग हैं:

  • BootstrapClassLoaderस्मृति में इन कक्षाओं में उपलब्ध यानी लोड हो रहा है इन कक्षाओं में लेने के लिए जिम्मेदार है।

  • अगला काम किसी भी बाहरी लाइब्रेरी / JAR को एप्लिकेशन के उचित कार्य के लिए मेमोरी में लोड करना है। ExtClassLoaderइस कार्य के लिए जिम्मेदार है। यह वर्ग लोडर java.ext.dirs पथ में उल्लिखित सभी .jar फ़ाइलों को लोड करने के लिए जिम्मेदार है।

  • तीसरा और मुख्य महत्वपूर्ण लोडर है AppClassLoader। एप्लिकेशन क्लास लोडर java.class.path सिस्टम प्रॉपर्टी में उल्लिखित क्लास फाइल्स को लोड करने के लिए जिम्मेदार है।

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

यहां छवि विवरण दर्ज करें

जावा क्लास लोडर के बारे में अधिक जानने के लिए इसे देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.