ما هو دور ClassLoader في Java؟



هذه المقالة عبارة عن دليل شامل حول كيفية عمل ClassLoader في Java. يناقش أنواع ومبادئ وأساليب ClassLoader في Java.

أثناء العمل في Java ، غالبًا ما نستخدم عددًا كبيرًا من الفئات. لا يتم تحميل فئات Java هذه مرة واحدة في الذاكرة ، بدلاً من ذلك ، يتم تحميلها عند طلب أحد التطبيقات. هذا هو المكان الذي تظهر فيه Java ClassLoaders في الصورة. لذا في هذه المقالة ، سأناقش كيفية استخدام ClassLoader في Java مع أمثلة.

سيتم تناول الموضوعات التالية في هذه المقالة:





  1. ما هو ClassLoader؟
  2. أنواع ClassLoader
  3. مبادئ ClassLoader
  4. طرق ClassLoader
  5. ClassLoader مخصص

لنبدأ!

ما هو ClassLoader في Java؟

يتم استدعاء ClassLoader في Java بواسطة Java Runtime Environment لتحميل الفئات ديناميكيًا كلما طلب ذلك التطبيق في Java Virtual Machine . نظرًا لأن ClassLoaders هي جزء من Java Runtime Environment ، فلن يكون لدى Java Virtual Machine أي فكرة عن أنظمة الملفات والملفات الأساسية.



الآن ، دعونا نفهم الأنواع المختلفة من ClassLoaders المضمنة في Java.

أنواع ClassLoader في Java

الأنواع المختلفة من ClassLoaders في Java هي كما يلي:

دعونا نناقش كل واحد منهم واحدًا تلو الآخر.



تمديد ClassLoader

كما يوحي الاسم ، يقوم Extension ClassLoader بتحميل امتدادات فئات Java الأساسية من ملف JDK مكتبة ملحق. وهو تابع لـ Bootstrap ClassLoader ويقوم بتحميل الامتدادات من دليل JRE / lib / text أو أي دليل آخر محدد في خاصية نظام java.ext.dirs.

تطبيق أو نظام ClassLoader

يعد Application أو System ClassLoader تابعًا لـ Extension ClassLoader. يقوم هذا النوع من ClassLoader بتحميل كافة فئات مستوى التطبيق الموجودة في خيار سطر الأوامر -cp أو في متغير بيئة CLASSPATH.

Bootstrap ClassLoader

كما نعلم جميعا ذلك فئات جافا بواسطة مثيل java.lang.ClassLoade. ولكن نظرًا لأن ClassLoaders عبارة عن فئات ، فإن Bootstrap ClassLoader مسؤول عن تحميل فئات JDK الداخلية. BootStrap ClassLoader هو رمز جهاز يبدأ العملية عندما يستدعيه JVM ويقوم بتحميل الفئات من rt.jar. لذلك ، يمكنك أن تفهم أن Bootstrap ClassLoader لا يخدم ClassLoader أصلًا وبالتالي يُعرف باسم Primordial ClassLoader.

ملحوظة: أولوية Bootstrap أعلى من الامتداد ، والأولوية المعطاة لـ Extension ClassLoader أعلى من Application ClassLoader. الرجوع إلى الصورة أدناه:

أنواع ClassLoader - ClassLoader في Java - Edureka

بعد ذلك في هذه المقالة ، دعنا نفهم المبادئ التي يعمل عليها ClassLoader.

مبادئ ClassLoader في Java

مجموعة القواعد التي تستند إليها Java ClassLoader هي المبادئ الثلاثة التالية:

دعونا نفهم كل واحد منهم.

خاصية التفرد

تضمن هذه الخاصية عدم وجود تكرار للفئات وأن جميع الفئات فريدة. تتأكد خاصية التفرد أيضًا من عدم تحميل ClassLoader الأصل بواسطة ClassLoader التابع للفئات. في سيناريو ، حيث يتعذر على ClassLoader العثور على الفئة ، سيحاول المثيل الحالي القيام بذلك بنفسه.

نموذج التفويض

يعمل ClassLoader في Java استنادًا إلى مجموعة العمليات التي قدمها نموذج التفويض. لذلك ، كلما تم إنشاء طلب للعثور على فئة أو مورد ، فإن مثيل ClassLoader سيفوض البحث عن الفئة أو المورد إلى ClassLoader الأصل.

تكون مجموعة العمليات التي تستند إليها ClassLoader كما يلي:

  • يتحقق Java Virtual Machine مما إذا كان قد تم تحميل الفصل أم لا ، عندما يأتي عبر الفصل.
  • في حالة تحميل الفصل JVM يشرع في تنفيذ الفصل ، ولكن في سيناريو حيث لا يتم تحميل الفصل ، إذنيطلب JVM من النظام الفرعي Java ClassLoader تحميل تلك الفئة المعينة. بعد ذلك ، يمنح النظام الفرعي ClassLoader التحكم في Application ClassLoader.
  • ثم يقوم Application ClassLoader بتفويض الطلب إلى ملحق ClassLoader ، والذي يقوم بعد ذلك بتمرير الطلب إلى Bootstrap ClassLoader.
  • الآن ، يبحث Bootstrap ClassLoader في ملفBootstrap classpath للتحقق مما إذا كان الفصل متاحًا أم لا. إذا كان الفصل متاحًا ، فسيتم تحميله ، وإلا يتم تمرير الطلب مرة أخرى إلى ملحق ClassLoader.
  • يتحقق ملحق ClassLoader للفئة في مسار فئة الامتداد.إذا كان الفصل متاحًا ، فسيتم تحميله ، وإلا يتم تمرير الطلب مرة أخرى إلى Application ClassLoader.
  • أخيرًا ، يبحث Application ClassLoader عن الفئة في مسار فئة التطبيق.إذا كان الفصل متاحًا ، فسيتم تحميله ، وإلا فسترى استثناءًا لـ ClassNotFoundException.

الرجوع إلى الصورة أدناه.

مبدأ الرؤية

وفقًا لهذا المبدأ ، تكون فصول الأطفال مرئية للفئات التي تم تحميلها بواسطة ClassLoaders الأصلية ، ولكن العكس ليس صحيحًا. لذلك ، فإن الفئات التي تم تحميلها بواسطة Application ClassLoader لها رؤية في الفئات المحملة بواسطة الامتداد و Bootstrap ClassLoader.

على سبيل المثال ، إذا كان لدينا فئتان: A & B ، افترض أن الفئة A يتم تحميلها بواسطة Application ClassLoader وأن الفئة B يتم تحميلها بواسطة Extensions ClassLoader. هنا ، تكون الفصول A و B مرئية لجميع تلك الفئات التي تم تحميلها بواسطة Application ClassLoader ، ولكن الفئة B مرئية فقط لتلك الفئات التي تم تحميلها بواسطة ملحق ClassLoader.

أيضًا ، إذا حاولت تحميل هذه الفئات باستخدام Bootstrap ClassLoader ، فسترى ملف java.lang.ClassNotFoundException . استثناء.

حسنًا ، الآن بعد أن تعرفت على أنواع ClassLoaders والمبادئ التي تقوم عليها ، دعنا نلقي نظرة على بعض الطرق المهمةمن java.lang.ClassLoader صف دراسي.

طرق ClassLoader في Java

قليل من الضروري من ClassLoader كما يلي:

loadClass (اسم السلسلة ، الحل المنطقي)

هذه الطريقة هي نقطة دخول ClassLoader وتستخدم لتحميل الفئة المشار إليها بواسطة JVM. يأخذ اسم كمعامل. تستدعي JVM طريقة loadClass () لحل مراجع الفئة عن طريق تعيين القيمة المنطقية على true. فقط إذا احتجنا إلى تحديد ما إذا كانت الفئة موجودة أم لا ، يتم تعيين المعلمة المنطقية على خطأ.

إعلان:

public class loadClass (String name، boolean Resolution) تطرح ClassNotFoundException {

حدد الفئة ()

طريقة أخيرة تستخدم لتعريف مصفوفة من البايتات كمثيل لفئة. في حالة عدم صلاحية الفئة ، فإنها ترمي ClassFormatError.

java هي a vs has a

إعلان:

تعريف الفئة النهائية المحمية (String name، byte [] b، int off، int len) يلقي ClassFormatError

findClass (اسم السلسلة)

يتم استخدام طريقة findClass للعثور على الفئة المحددة. لذلك ، يجد فقط الفئة ذات الاسم المؤهل بالكامل كمعامل ولكن لا يقوم بتحميل الفئة. تستدعي طريقة loadClass () هذه الطريقة إذا لم يتمكن ClassLoader الأصل من العثور على الفئة المطلوبة. أيضًا ، إذا لم يجد أحد الوالدين لـ ClassLoader الفئة ، فإن التطبيق الافتراضي يطرح ملف درجة بدون استثنائات.

إعلان:

يلقي findClass المحمية (اسم السلسلة) ClassNotFoundException

Class.forName (اسم السلسلة ، التهيئة المنطقية ، محمل ClassLoader)

تستخدم هذه الطريقة لتحميل وتهيئة الفصل. يعطي خيارًا لاختيار أي من ClassLoaders وإذا كانت المعلمة ClassLoader هي NULL ، ثم يتم استخدام Bootstrap ClassLoader تلقائيًا.

إعلان:

فئة عامة ثابتة من أجل الاسم (اسم السلسلة ، التهيئة المنطقية ، محمل ClassLoader) تطرح ClassNotFoundException

getParent ()

يتم استخدام الأسلوب getParent لإرجاع ClassLoader الأصل للتفويض.

إعلان:

العامة النهائية ClassLoader getParent ()

getResource ()

كما يوحي الاسم ، حاولت طريقة getResource () العثور على مورد بالاسم المحدد. سيقوم في البداية بتفويض الطلب إلى ClassLoader الأصل للمورد. في حالة كون الأصل فارغًا ، يتم البحث عن مسار ClassLoader المدمج في JVM. الآن ، إذا فشل هذا ، فإن الطريقة ستستدعي findResource (String) للعثور على المورد ، حيث يتم تحديد اسم المورد كمدخل يمكن أن يكون إما مسار فئة مطلق أو نسبي. ثم تقوم بإرجاع كائن URL لقراءة المورد أو تقوم بإرجاع قيمة فارغة إذا لم يكن لدى المورد الامتيازات الكافية لإرجاع المورد أو لم يتم العثور عليه.

إعلان:

عنوان URL العام getResource (اسم السلسلة)

بعد ذلك ، في هذه المقالة حول ClassLoader في Java ، دعنا نفهم Custom ClassLoader.

ClassLoader مخصص في Java

ستهتم برامج ClassLoaders المدمجة بمعظم الحالات التي تكون فيها الملفات موجودة بالفعل في نظام الملفات ، ولكن إذا كنت ترغب في تحميل الفئات من محرك الأقراص الثابتة المحلي ، فأنت بحاجة إلى استخدام ClassLoaders المخصصة.

إنشاء ClassLoader مخصص

لإنشاء ClassLoader مخصص ، تحتاج إلى تمديد ملحق كلاس لودر فئة وتجاوز findClass () طريقة:

مثال: دعنا ننشئ ClassLoader مخصصًا يمد ClassLoader الافتراضي ويحمل مصفوفة بايت من الملف المحدد. الرجوع إلى الكود أدناه.

package edureka import java.io.ByteArrayOutputStream import java.io.File import java.io.IOException import java.io.InputStream public class نموذج يمتد ClassLoader {Override public Class findClass (String samplename) يطرح ClassNotFoundException {بايت [] b = customLoadClassFromException (samplename) يُرجع selectClass (samplename، b، 0، b.length)} بايت خاص [] customLoadClassFromFile (سلسلة demofilename) {InputStream inStream = getClass (). getClassLoader (). getResourceAsStream (demofilename.replace ('.'، File. eparatorChar) + '.class') بايت [] المخزن المؤقت ByteArrayOutputStream bStream = new ByteArrayOutputStream () int nextValue = 0 try {while ((nextValue = inStream.read ())! = -1) {bStream.write (nextValue)}} catch (IOException e) {e.printStackTrace ()} المخزن المؤقت = bStream.toByteArray () عودة المخزن المؤقت}}

بهذا ننتهي من هذه المقالة حول ClassLoader في Java. أتمنى أن تكون قد فهمت ما هي ClassLoaders في Java ، وطرقها ، والأنواع المختلفة من ClassLoaders ، إلخ.

إذا وجدت هذه المقالة حول 'ClassLoader في Java' ، فراجع ملف من Edureka ، وهي شركة تعليمية موثوقة عبر الإنترنت مع شبكة تضم أكثر من 250000 متعلم راضٍ منتشرين في جميع أنحاء العالم. نحن هنا لمساعدتك في كل خطوة في رحلتك ، لكي تصبح بجانب أسئلة المقابلة في جافا هذه ، توصلنا إلى منهج مصمم للطلاب والمهنيين الذين يريدون أن يكونوا جافا مطور.

لديك سؤال لنا؟ يرجى ذكر ذلك في قسم التعليقات في 'ClassLoader in Java ' وسنعاود الاتصال بك في أقرب وقت ممكن.