সূর্যের এই দুর্দান্ত টিউটোরিয়াল থেকে নেওয়া :
প্রেরণা
স্ট্যাটিকালি সংকলিত প্রোগ্রামিং ভাষায় লিখিত অ্যাপ্লিকেশনগুলি, যেমন সি এবং সি ++, স্থানীয়, মেশিন-নির্দিষ্ট নির্দেশিকায় সংকলিত হয় এবং এক্সিকিউটেবল ফাইল হিসাবে সংরক্ষণ করা হয়। কোডটিকে একটি এক্সিকিউটেবল নেটিভ কোডের সাথে সংযুক্ত করার প্রক্রিয়াটিকে লিঙ্কিং বলা হয় - এক্সিকিউটেবল অ্যাপ্লিকেশন তৈরি করতে ভাগ করে নেওয়া লাইব্রেরি কোডের সাথে আলাদাভাবে সংকলিত কোডটি মার্জ করা। এটি জাভা হিসাবে গতিশীল সংকলিত প্রোগ্রামিং ভাষায় পৃথক। জাভাতে, জাভা সংকলক দ্বারা উত্পাদিত। ক্লাস ফাইলগুলি জাভা ভার্চুয়াল মেশিনে (জেভিএম) লোড না হওয়া অবধি থাকে - অন্য কথায়, লিঙ্কিং প্রক্রিয়াটি জেভিএম দ্বারা রানটাইমে সঞ্চালিত হয়। ক্লাসগুলি একটি 'প্রয়োজন হিসাবে' ভিত্তিতে জেভিএম-এ লোড করা হয়। এবং যখন বোঝা শ্রেণি অন্য শ্রেণীর উপর নির্ভর করে তখন সেই শ্রেণিটিও লোড হয়।
যখন একটি জাভা অ্যাপ্লিকেশন চালু করা হয়, তখন প্রথম শ্রেণিটি চালানো হয় (বা অ্যাপ্লিকেশনটিতে প্রবেশের বিন্দুতে) প্রধান () নামে পরিচিত পাবলিক স্ট্যাটিক শূন্য পদ্ধতি রয়েছে। এই শ্রেণীর সাধারণত অন্যান্য ক্লাসের রেফারেন্স থাকে এবং রেফারেন্সযুক্ত ক্লাসগুলি লোড করার সমস্ত প্রচেষ্টা ক্লাস লোডার দ্বারা চালিত হয়।
এই পুনরাবৃত্ত শ্রেণীর লোডিংয়ের পাশাপাশি ক্লাস লোডিং আইডিয়াটি সাধারণভাবে অনুভূতি পেতে নিম্নলিখিত সাধারণ ক্লাসটি বিবেচনা করুন:
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]
আপনি দেখতে পাচ্ছেন, অ্যাপ্লিকেশন শ্রেণির (হ্যালো অ্যাপ) প্রয়োজনীয় জাভা রানটাইম ক্লাসগুলি প্রথমে লোড হয়।
জাভা 2 প্ল্যাটফর্মে শ্রেণি লোডার
অ্যাপ্লিকেশন বিকাশকারীদের জীবনযাত্রাকে আরও সহজ করে তুলতে জাভা প্রোগ্রামিং ভাষাটি বিকাশ লাভ করে। এটি এমন এপিআই সরবরাহ করে করা হয় যা আপনার জীবনকে সহজ করে দেয় মৌলিক প্রক্রিয়াগুলির বাস্তবায়ন বিবরণের পরিবর্তে ব্যবসায়িক যুক্তিতে মনোনিবেশ করার অনুমতি দিয়ে। জাভা প্ল্যাটফর্মের পরিপক্কতা প্রতিফলিত করার জন্য এটি জেএসইএস 1.5 কে জে 2 এসই 5.0 এ সাম্প্রতিক পরিবর্তনের মাধ্যমে প্রমাণিত হয়েছে।
জেডিকে ১.২ হিসাবে, জেভিএম মধ্যে নির্মিত একটি বুটস্ট্র্যাপ শ্রেণীর লোডার জাভা রানটাইমের ক্লাসগুলি লোড করার জন্য দায়বদ্ধ। এই শ্রেণীর লোডারটি কেবল ক্লাসগুলি লোড করে যা বুট শ্রেণিপথের মধ্যে পাওয়া যায় এবং যেহেতু এগুলি বিশ্বস্ত শ্রেণি, তাই অবিশ্বস্ত শ্রেণীর ক্ষেত্রে বৈধকরণ প্রক্রিয়া সম্পাদিত হয় না। বুটস্ট্র্যাপ শ্রেণীর লোডার ছাড়াও, জেভিএমের স্ট্যান্ডার্ড এক্সটেনশন এপিআই থেকে ক্লাস লোড করার জন্য দায়বদ্ধ একটি এক্সটেনশন ক্লাস লোডার এবং একটি সিস্টেম বর্গ লোডার রয়েছে যা সাধারণ বর্গের পথ থেকে আপনার অ্যাপ্লিকেশন ক্লাস থেকে ক্লাস লোড করে।
যেহেতু একাধিক শ্রেণি লোডার রয়েছে তাই এগুলি এমন গাছে উপস্থাপন করা হয় যার মূল বুটস্ট্র্যাপ শ্রেণি লোডার। প্রতিটি শ্রেণি লোডার এর পিতামাতা বর্গ লোডার একটি রেফারেন্স আছে। যখন কোনও শ্রেণি লোডারকে কোনও শ্রেণি লোড করতে বলা হয়, তখন আইটেমটি নিজে লোড করার চেষ্টা করার আগে এটি তার পিতামাতা শ্রেণীর লোডারের সাথে পরামর্শ করে। পরিবর্তে পিতামাতা তার পিতামাতার সাথে পরামর্শ করে এবং আরও কিছু করে। সুতরাং সমস্ত পূর্বসূরি শ্রেণীর লোডাররা ক্লাসটি সন্ধান করতে না পারলেই বর্তমান বর্গ লোডার জড়িত থাকে। অন্য কথায়, একটি প্রতিনিধি মডেল ব্যবহার করা হয়।
Java.lang.ClassLoader ক্লাস
java.lang.ClassLoader
একটি বিমূর্ত বর্গ যে অ্যাপলিকেশনের জেভিএম পরিবর্তনশীল লোড ক্লাসের পদ্ধতিতে প্রসারিত করতে প্রয়োজন যে subclassed করা যেতে পারে। java.lang.ClassLoader
(এবং এর সাবক্লাস) এর কনস্ট্রাক্টর আপনি যখন কোনও নতুন শ্রেণি লোডার ইনস্ট্যান্ট করবেন তখন আপনাকে পিতামাতাকে নির্দিষ্ট করার অনুমতি দেয়। যদি আপনি স্পষ্টভাবে কোনও পিতামাতাকে নির্দিষ্ট না করেন তবে ভার্চুয়াল মেশিনের সিস্টেম বর্গ লোডারটি ডিফল্ট পিতামাতার হিসাবে নিযুক্ত করা হবে। অন্য কথায়, ClassLoader শ্রেণি ক্লাস এবং সংস্থানগুলি অনুসন্ধান করার জন্য একটি প্রতিনিধি মডেল ব্যবহার করে। অতএব, ClassLoader এর প্রতিটি উদাহরণের সাথে সম্পর্কিত প্যারেন্ট বর্গ লোডার রয়েছে, যাতে কোনও শ্রেণি বা সংস্থান সন্ধান করার জন্য অনুরোধ করা হলে, ক্লাস বা সংস্থান নিজেই অনুসন্ধান করার চেষ্টা করার আগে টাস্কটি তার পিতামাত্ত শ্রেণীর লোডারকে অর্পণ করা হয়। loadClass()
ClassLoader পদ্ধতি নিম্নলিখিত কাজগুলো যাতে যখন একটি বর্গ লোড করতে নামক সঞ্চালিত:
যদি কোনও ক্লাস ইতিমধ্যে লোড করা হয়ে থাকে তবে এটি এটি ফিরিয়ে দেয়। অন্যথায়, এটি নতুন শ্রেণীর জন্য অনুসন্ধানকে প্যারেন্ট ক্লাস লোডারকে প্রতিনিধিত্ব করে। অভিভাবক শ্রেণীর লোডার যদি ক্লাসটি না খুঁজে পায়, তবে ক্লাসটি সন্ধান এবং লোড করার জন্য loadClass()
পদ্ধতিটি কল করে findClass()
। finalClass()
বর্তমান বর্গ লোডারে বর্গ জন্য পদ্ধতি অনুসন্ধান বর্গ পিতা বা মাতা বর্গ লোডার দ্বারা পাওয়া যায়নি পারেন।
মূল নিবন্ধে আরও রয়েছে, যা আপনাকে নিজের নেটওয়ার্ক ক্লাস লোডারগুলি কীভাবে প্রয়োগ করতে হবে তাও দেখায়, যা কেন (এবং কীভাবে) আপনার প্রশ্নের উত্তর দেয়। আরও দেখুন এপিআই ডক্স ।