জাভা ক্লাসলোডার কী?


174

কয়েকটি সাধারণ বাক্যে, একটি জাভা ক্লাসলোডার কী, কখন এটি ব্যবহৃত হয় এবং কেন?

ঠিক আছে, আমি একটি উইকি নিবন্ধ পড়েছি। ClassLoader ক্লাসগুলি লোড করে। ঠিক আছে. সুতরাং আমি যদি জার ফাইল এবং আমদানি অন্তর্ভুক্ত করি তবে একটি ক্লাসলোডার কাজটি করে।

আমি এই ক্লাসলোডারকে কেন বিরক্ত করব? আমি এটি কখনও ব্যবহার করি নি এবং এটির অস্তিত্বও জানতাম না।

প্রশ্নটি হল, কেন ClassLoader শ্রেণি বিদ্যমান? এবং এছাড়াও, আপনি বাস্তবে এটি কীভাবে ব্যবহার করবেন? (কেস বিদ্যমান, আমি জানি।)


আপনি যদি নিজের প্রশ্নটি সংকুচিত করেন তবে আপনি আরও ভাল ফলাফল পাবেন, যেমন আপনি যে নির্দিষ্ট অংশটি বুঝতে পারছেন না সেটি নির্দেশ করে, আপনি কীভাবে পরিচিত অন্য কোনও ভাষার সাথে এটি কীভাবে সম্পর্কিত etc. ইত্যাদি
জেআরএল

75
এটি একটি সম্পূর্ণ যুক্তিসঙ্গত প্রশ্ন, যখন ধারণাটি ব্যাখ্যা করার জন্য কেউ কেউ কয়েকটি সাধারণ বাক্য অনুসন্ধান করছেন তার দৃষ্টিকোণ থেকে দেখা যায়
অক্সবো_লাক্স

এই ভিডিওটি আগ্রহী হতে পারে: আপনি কি সত্যিই ক্লাস লোডার পান?
asmaier

উত্তর:


231

সূর্যের এই দুর্দান্ত টিউটোরিয়াল থেকে নেওয়া :

প্রেরণা

স্ট্যাটিকালি সংকলিত প্রোগ্রামিং ভাষায় লিখিত অ্যাপ্লিকেশনগুলি, যেমন সি এবং সি ++, স্থানীয়, মেশিন-নির্দিষ্ট নির্দেশিকায় সংকলিত হয় এবং এক্সিকিউটেবল ফাইল হিসাবে সংরক্ষণ করা হয়। কোডটিকে একটি এক্সিকিউটেবল নেটিভ কোডের সাথে সংযুক্ত করার প্রক্রিয়াটিকে লিঙ্কিং বলা হয় - এক্সিকিউটেবল অ্যাপ্লিকেশন তৈরি করতে ভাগ করে নেওয়া লাইব্রেরি কোডের সাথে আলাদাভাবে সংকলিত কোডটি মার্জ করা। এটি জাভা হিসাবে গতিশীল সংকলিত প্রোগ্রামিং ভাষায় পৃথক। জাভাতে, জাভা সংকলক দ্বারা উত্পাদিত। ক্লাস ফাইলগুলি জাভা ভার্চুয়াল মেশিনে (জেভিএম) লোড না হওয়া অবধি থাকে - অন্য কথায়, লিঙ্কিং প্রক্রিয়াটি জেভিএম দ্বারা রানটাইমে সঞ্চালিত হয়। ক্লাসগুলি একটি 'প্রয়োজন হিসাবে' ভিত্তিতে জেভিএম-এ লোড করা হয়। এবং যখন বোঝা শ্রেণি অন্য শ্রেণীর উপর নির্ভর করে তখন সেই শ্রেণিটিও লোড হয়।

যখন একটি জাভা অ্যাপ্লিকেশন চালু করা হয়, তখন প্রথম শ্রেণিটি চালানো হয় (বা অ্যাপ্লিকেশনটিতে প্রবেশের বিন্দুতে) প্রধান () নামে পরিচিত পাবলিক স্ট্যাটিক শূন্য পদ্ধতি রয়েছে। এই শ্রেণীর সাধারণত অন্যান্য ক্লাসের রেফারেন্স থাকে এবং রেফারেন্সযুক্ত ক্লাসগুলি লোড করার সমস্ত প্রচেষ্টা ক্লাস লোডার দ্বারা চালিত হয়।

এই পুনরাবৃত্ত শ্রেণীর লোডিংয়ের পাশাপাশি ক্লাস লোডিং আইডিয়াটি সাধারণভাবে অনুভূতি পেতে নিম্নলিখিত সাধারণ ক্লাসটি বিবেচনা করুন:

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()বর্তমান বর্গ লোডারে বর্গ জন্য পদ্ধতি অনুসন্ধান বর্গ পিতা বা মাতা বর্গ লোডার দ্বারা পাওয়া যায়নি পারেন।


মূল নিবন্ধে আরও রয়েছে, যা আপনাকে নিজের নেটওয়ার্ক ক্লাস লোডারগুলি কীভাবে প্রয়োগ করতে হবে তাও দেখায়, যা কেন (এবং কীভাবে) আপনার প্রশ্নের উত্তর দেয়। আরও দেখুন এপিআই ডক্স


47

বেশিরভাগ জাভা বিকাশকারীদের কখনই ক্লাস লোডারগুলি স্পষ্টভাবে ব্যবহার করার প্রয়োজন হবে না (সংস্থান লোড ব্যতীত যাতে তারা এখনও জেআর-তে বান্ডিল হয়ে থাকে তখন এটি কাজ করে), তাদের নিজস্ব লেখা লিখুন।

ক্লাসলয়েডারগুলি বৃহত সিস্টেম এবং সার্ভার অ্যাপ্লিকেশনগুলিতে এই জাতীয় জিনিসগুলি করতে ব্যবহৃত হয়:

  • একটি সিস্টেমকে মডুলারি করুন এবং রানটাইমের সময় লোড, আনলোড এবং মডিউল আপডেট করুন
  • সমান্তরালভাবে একটি API লাইব্রেরির বিভিন্ন সংস্করণ (যেমন একটি এক্সএমএল পার্সার) ব্যবহার করুন
  • একই JVM এর মধ্যে চলমান বিভিন্ন অ্যাপ্লিকেশনকে বিচ্ছিন্ন করুন (তারা একে অপরের সাথে হস্তক্ষেপ করবেন না তা নিশ্চিত করে যেমন স্ট্যাটিক ভেরিয়েবলের মাধ্যমে)

29

প্রশ্নটি হল "কেন এই ক্লাসলোডার শ্রেণীর উপস্থিতি একজনকে বিরক্ত করা উচিত"?

ওয়েল, বেশিরভাগ যাতে জিনিসগুলি ভুল হয়ে যায় তবে আপনি ঠিক করতে পারেন :-)।

এটি সত্য, যতক্ষণ না আপনি কেবল একটি অ্যাপ্লিকেশন লিখবেন, এটি একটি জেআর-এ সংকলন করুন এবং সম্ভবত কয়েকটি অতিরিক্ত লাইব্রেরি জেআর অন্তর্ভুক্ত করবেন, আপনার ক্লাস লোডার সম্পর্কে জানতে হবে না, এটি কেবল কাজ করবে।

তবুও, পর্দার আড়ালে কী ঘটে তা আরও ভালভাবে বুঝতে ক্লাস লোডার এবং শ্রেণি লোডিং সম্পর্কে কিছুটা জানা সহায়ক helpful উদাহরণস্বরূপ, কোনও শ্রেণি লোড হওয়ার পরে "স্ট্যাটিক ইনিশিয়ালাইজারগুলি" চলবে, সুতরাং তারা কখন চলবে তা বোঝার জন্য, ক্লাস লোডার কখন এগুলি লোড করবে সে বিষয়ে আপনাকে কীভাবে সিদ্ধান্ত নেওয়া উচিত তা জানতে হবে।

এছাড়াও .. আপনি বাস্তবে এটি কীভাবে ব্যবহার করবেন?

সাধারণ ক্ষেত্রে, আপনার এগুলি লাগবে না। যাইহোক, রানটাইমের সময় আপনার যদি স্পষ্ট নিয়ন্ত্রণের সাথে কোডটি গতিশীলভাবে লোড করা দরকার (যেমন কোনও নেটওয়ার্কের উপর লোড করা, সংকলনের সময় প্লাগইনগুলি লোড করা না হয় ইত্যাদি), আপনাকে আরও কিছু করার প্রয়োজন হতে পারে। তারপরে আপনি যেমন নিজের ক্লাস লোডার লিখতে পারেন। লিঙ্কগুলির জন্য অন্যান্য উত্তরগুলি দেখুন।


14

ClassLoaderজাভাতে একটি ক্লাস যা জাভাতে ক্লাস ফাইল লোড করতে ব্যবহৃত হয়। জাভা কোডটি ক্লাস ফাইলে javacসংকলক দ্বারা সংকলিত হয় এবং জেভিএম জাভা প্রোগ্রাম চালায়, ক্লাস ফাইলে লেখা বাইট কোডগুলি সম্পাদন করে।

ক্লাসলয়েডার ফাইল সিস্টেম, নেটওয়ার্ক বা অন্য কোনও উত্স থেকে শ্রেণি ফাইল লোড করার জন্য দায়বদ্ধ। জাভা, বুটস্ট্র্যাপ , এক্সটেনশন এবং সিস্টেম বা অ্যাপ্লিকেশন শ্রেণির লোডারটিতে তিনটি ডিফল্ট শ্রেণীর লোডার ব্যবহৃত হয় ।

ClassLoader


ClassLoader কীভাবে কাজ করে

## ক্লাসলুডার জেভিএমের সাথে ইন্টারঅ্যাকশন এখানে চিত্র বর্ণনা লিখুন

আরও @: কিভাবে-শ্রেণিবদ্ধ-জাভা-এইচটিএমএল-এ কাজ করে


6

ক্লাস লোডারগুলি জেভিএম-এর একটি কার্যকরী উপাদান, যা '.ক্লাস' ফাইল থেকে বা নেটওয়ার্কের মধ্য থেকে হিপের মেথড এরিয়ায় শ্রেণি ডেটা লোড করে।

জেভিএমের অবিচ্ছেদ্য অংশের মতো মনে হচ্ছে তবে শেষ জাভা ব্যবহারকারী হিসাবে আমাকে কেন উদ্বিগ্ন করা উচিত? এখানে কেন:

প্রতিটি শ্রেণীর লোডারটির নিজস্ব নামের স্থান এবং নির্দিষ্ট শ্রেণি লোডার দ্বারা আহ্বৃত ক্লাসগুলি এর নামের স্থানটিতে প্রবেশ করে।

দুটি পৃথক শ্রেণীর লোডার দ্বারা চাওয়া ক্লাসগুলির একে অপরের উপরে দৃশ্যমানতা থাকবে না, যার ফলে বর্ধিত সুরক্ষার ফলস্বরূপ।

শ্রেণি লোডার পিতামাতাদের শিশু প্রতিনিধিদল প্রক্রিয়াটি নিশ্চিত করে যে জাভা এপিআই ক্লাসগুলি কখনও অননুমোদিত কোড দ্বারা হ্যাক করা যায় না।

বিশদ জন্য এখানে দেখুন


1

শ্রেণি লোডাররা শ্রেণিবদ্ধ। জেভিএম-তে ক্লাসগুলি প্রবর্তিত হয়েছে কারণ তারা ইতিমধ্যে জেভিএম-তে চলছে এমন একটি ক্লাসে নাম দ্বারা রেফারেন্স করা হয়।

প্রথম শ্রেণীর বোঝা কেমন? আপনার ক্লাসে ঘোষিত পদ্ধতির
সাহায্যে খুব প্রথম শ্রেণি লোড হয় static main()। পরবর্তীকালে লোড হওয়া সমস্ত ক্লাস ক্লাস দ্বারা লোড করা হয়, যা ইতিমধ্যে লোড এবং চলমান।

একটি শ্রেণি লোডার একটি নেমস্পেস তৈরি করে। সমস্ত জেভিএম অন্তত একটি শ্রেণি লোডার অন্তর্ভুক্ত করে যা জেভিএমের মধ্যে এম্বেড থাকে যাকে বলা হয় প্রিমর্ডিয়াল (বা বুটস্ট্র্যাপ) শ্রেণি লোডার। এটি একটি জিনিস, এবং আমরা অ-আদিম শ্রেণির লোডারগুলির দিকে নজর দেব। আধ্যাত্মিক শ্রেণীর লোডারটির জায়গায় ব্যবহারকারীর সংজ্ঞায়িত শ্রেণি লোডার ব্যবহারের অনুমতি দেওয়ার জন্য জেভিএমের এতে একটি হুক রয়েছে। এখানে জেভিএম তৈরি ক্লাস লোডার রয়েছে।

বুটস্ট্র্যাপ (প্রাথমিক) এই শ্রেণীর লোডারটি আবার লোডযোগ্য নয়। জেডিকে অভ্যন্তরীণ ক্লাস, জাভা। * প্যাকেজগুলি লোড করে (সাধারণত rt.jar এবং i18n.jar লোড করে)। এক্সটেনশনগুলি এই শ্রেণীর লোডারটি আবার লোডযোগ্য নয়। জেডিকে এক্সটেনশান ডিরেক্টরি থেকে জার ফাইল লোড করে (সাধারণত lib / JRE এর এক্সট্রা)। সিস্টেম এই শ্রেণীর লোডার আবার লোডযোগ্য নয়। সিস্টেম শ্রেণীর পথ থেকে ক্লাসগুলি লোড করে।

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


1

আপনি যখন জিজ্ঞাসা করছেন কেন ClassLoader শ্রেণিটি বিদ্যমান, কারণটি বেশ সহজ - এটি ক্লাস চালানোর সময় ক্লাস ফাইলগুলি অনুসন্ধান এবং লোড করার জন্য দায়ী ।

এর বিস্তারিত ব্যাখ্যা করা যাক।

জেভিএম-এ, প্রতিটি ক্লাসের কিছু উদাহরণ লোড হয় java.lang.ClassLoader। যখনই আপনার নতুন জাভা প্রোগ্রামটি যথারীতি জাভা প্রোগ্রাম প্রবর্তন java <classname>কমান্ড দ্বারা শুরু করা হয় , প্রথম পদক্ষেপটি হ'ল যথাযথ কাজের মতো java.lang.Objectএবং অন্যান্য রানটাইম ক্লাসগুলির জন্য প্রয়োজনীয় সমস্ত কী ক্লাসগুলি ( rt.jar) মেমরিতে লোড করা হয় ।

ক্লাসলুডারে এখন 3 টি অংশ রয়েছে:

  • BootstrapClassLoaderস্মৃতিতে এই শ্রেণীর প্রাপ্তিসাধ্য অর্থাত লোড করলে সেই শ্রেণীর তৈরীর জন্য দায়ী।

  • পরবর্তী কাজটি হ'ল অ্যাপ্লিকেশনটির সঠিক কাজের জন্য যেকোন বাহ্যিক গ্রন্থাগার / জেআর স্মৃতিতে লোড করা load ExtClassLoaderএই কাজের জন্য দায়ী। Java.ext.dirs পাথে উল্লিখিত সমস্ত .jar ফাইল লোড করার জন্য এই শ্রেণীর লোডার দায়বদ্ধ।

  • তৃতীয় এবং প্রধান গুরুত্বপূর্ণ বর্গ লোডার হ'ল AppClassLoader। Java.class.path সিস্টেমের সম্পত্তিটিতে উল্লিখিত শ্রেণি ফাইলগুলি লোড করার জন্য অ্যাপ্লিকেশন শ্রেণির লোডার দায়বদ্ধ।

এটাও গুরুত্বপূর্ণ যে ডিফল্ট ClassLoader বাস্তবায়নগুলি আপনাকে জাভিএমকে দরকারী এবং আকর্ষণীয় উপায়ে কাস্টমাইজ করতে সক্ষম করে এবং ক্লাস ফাইলগুলিকে সিস্টেমে কীভাবে আনা হয় তা সম্পূর্ণরূপে সংজ্ঞায়িত করতে সক্ষম করে।

এখানে চিত্র বর্ণনা লিখুন

জাভা ক্লাস লোডার সম্পর্কে আরও জানতে এটি পরীক্ষা করে দেখুন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.