सूर्य से इस अच्छे ट्यूटोरियल से लिया गया :
प्रेरणा
सी और सी ++ जैसे सांख्यिकीय रूप से संकलित प्रोग्रामिंग भाषाओं में लिखे गए एप्लिकेशन को मूल, मशीन-विशिष्ट निर्देशों में संकलित किया जाता है और एक निष्पादन योग्य फ़ाइल के रूप में सहेजा जाता है। एक निष्पादन योग्य मूल कोड में कोड को जोड़ने की प्रक्रिया को लिंकिंग कहा जाता है - एक निष्पादन योग्य एप्लिकेशन बनाने के लिए साझा लाइब्रेरी कोड के साथ अलग संकलित कोड का विलय। यह जावा जैसे गतिशील रूप से संकलित प्रोग्रामिंग भाषाओं में अलग है। जावा में, जावा कंपाइलर द्वारा उत्पन्न .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()
वर्तमान वर्ग लोडर में वर्ग के लिए विधि खोज वर्ग माता पिता वर्ग लोडर से नहीं मिला था यदि।
मूल लेख में अधिक है, जो आपको यह भी दिखाता है कि अपने नेटवर्क क्लास लोडर को कैसे लागू किया जाए, जो आपके प्रश्न का उत्तर क्यों (और कैसे) देता है। एपीआई डॉक्स भी देखें ।