سؤال

هل يمكن لأي شخص أن يوجهني موردا جيدا أو يشرح لي عن المفهوم وراء لوادر الفئة؟ لقد وجدت المورد التالي على لوادر الفئة http://www.onjava.com/lpt/a/5586. ولكن لا تزال مساعدة. قد تبدو الأسئلة التالية سخيفة ولكن تحاول الإجابة عليها دائما يربكني.

  • لماذا يكتب المطورون لوادر فئة مخصصة، لماذا لا تستدعي محمل فئة Bootstrap لاستدعاء فصولك المخصصة؟ ما هي الحاجة لتحديد لوادر فئة مخصصة؟
  • لماذا هناك العديد من أنواع اللوادر الفئة؟ على سبيل المثال: bootsrap، الفني، محمل فئة الكاتالينا الخ،

    شكرا مقدما.

هل كانت مفيدة؟

المحلول

لقد وجدت ما يلي، أسباب صالحة لإنشاء Classloaders مخصصين:

  1. تريد تحميل فئة من مصدر غير تقليدي (على سبيل المثال، يتم تخزين ByTecode لصف واحد في قاعدة بيانات، عبر الشبكة أو حملت كما 0 و 1s بواسطة pidgeons - messengerPidgeClassloader). هناك بعض تطبيقات الفصل الدراسي بالفعل في API لهذه الحالات، مثل urlclassloader..

  2. تحتاج إلى تحديد تسلسل هرمي مختلف لتحميل الفصول. ينفصل التطبيقات الافتراضية للوحة النموذجية البحث أولا إلى الوالد، ثم يحاولون تحميل الفصل نفسه. ربما تريد التسلسل الهرمي مختلف. هذا هو السبب في أن OSGI و Eclipse لها عباد نصير خاص به كملفات واضحة .MF تحدد جميع أنواع مسارات التسلسل الهرمي الغريب (تحميل الأصدقاء، على سبيل المثال). تنفذ جميع Classloaders Eclipse واجهة BundleClassloader ولدي بعض التعليمات البرمجية الإضافية للعثور على الموارد داخل الإضافات Eclipse.

  3. تحتاج إلى القيام ببعض التعديلات إلى bytecode. ربما يتم تشفير bytecode، وسوف تقوم بإلغاء تشغيلها على الطيران (ليس ذلك يساعد، حقا، ولكن قد حاول). ربما تريد "التصحيح" الطبقات المحملة على الطاير (تعزيز bytecode la jdo).

إن استخدام Classloader مختلف عن نظام Classlader مطلوب إذا كنت بحاجة إلى تفريغ الفئات من الذاكرة، أو لتحميل الفئات مما يمكن تغيير تعريفها في وقت التشغيل. حالة نموذجية هي تطبيق يقوم بإنشاء فئة تعمل من ملف XML، على سبيل المثال، ثم يحاول إعادة تحميل هذه الفئة. بمجرد أن يكون الفصل في نظام System Classloader، لا توجد طريقة لتفريغها ولديها تعريف جديد.

نصائح أخرى

الاستخدام المشترك للنظرين هو عزل جرة. إذا كان لديك تطبيق يستخدم الإضافات (كسوف, مافن 2)، ثم يمكنك الحصول على هذا الموقف: يحتاج البرنامج المساعد X إلى جرة A مع الإصدار 1.0 بينما يحتاج البرنامج المساعد Y إلى نفس الجرة ولكن الإصدار 2.0. X لا يعمل مع الإصدار 2.0، على الرغم من.

إذا كان لديك نصائح، فيمكنك إنشاء أقسام من الفصول (فكر في الجزر المعزولة المتصلة بالجسور الرفيعة؛ الجسور هي الفصادين). بهذه الطريقة، يمكن للمعدلين التحكم في ما يمكن أن يراه كل مساعد.

عندما يقوم البرنامج المساعد X Instantiates بفئة فئة، والتي لها حقول ثابتة، هذه ليست مشكلة ولن يكون هناك خلط مع الفئة "نفسها" في البرنامج المساعد Y لأن كل كصد سوف يقوم في الواقع بإنشاء مثيله الخاص للفئة FOO. ثم يكون لديك فئتين في الذاكرة، حيث cl1.getName().equals(cl2.getName()) يكون true لكن cl1.equals(cl2) ليس. هذا يعني أن مثيلات CL1 ليست مهمة متوافقة مع مثيلات CL2. هذا يمكن أن يؤدي إلى غريب ClassCastExceptions الذي يقول ذلك org.project.Foo لا يمكن تعيينها org.project.Foo.

تماما مثل مع الجزر البعيدة، فإن الفئتين لا يدركون أن الآخر موجود. فكر في الحيوانات المستنسخة البشرية التي ولدت ثم نشأت في جزر مختلفة. من وجهة نظر VM، لا توجد مشكلة لأن مثيلات فئة النوع تتم معالجتها مثل أي كائن آخر: يمكن أن يكون هناك العديد منها. أن تعتقد أن بعضهم "نفس" لا يهم إلى VM.

استخدام آخر لهذا النمط هو أنه يمكنك التخلص من الفصول التي تم تحميلها بهذه الطريقة: فقط تأكد من عدم وجود أحد مؤشرا إلى أي كائن تم إنشاؤه من الفئات المحملة من Classloader ثم ننسى النموذج أيضا. على المدى التالي من gc., ، تتم إزالة جميع الفصول المحملة بواسطة هذا الكلاس من الذاكرة. هذا يتيح لك "إعادة تحميل" طلبك دون الحاجة إلى إعادة تشغيل VM بالكامل.

مدونات زوجين كتبتها في الماضي العميق حول استخدام النفايات بعد التفويض:

لا يمكنك الذهاب في المصدر الخام، في حالات مثل هذا. اذا أنت حقا تريد الداخلي مخدر، النواة الصلبة, ، اقرأ البتات ذات الصلة من مواصفات الجهاز الظاهري Java.

رابط جيد آخر لوادر فئة Java - جافا الكلاس

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

وبعبارة أخرى، إذا كنت تسأل لماذا تحتاج إلى إنشاء الفصل الدراسي الخاص بك، فلن تحتاج إلى إنشاء واحدة؛)

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

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

لماذا يكتب المطورون لوادر فئة مخصصة، لماذا لا تستدعي محمل فئة Bootstrap لاستدعاء فصولك المخصصة؟ ما هي الحاجة لتحديد لوادر فئة مخصصة؟

اعتمادا على التطبيق، قد يؤدي المطورون إلى تجاوز آلية تحميل الفئة أو استبدالها بالكامل لتناسب احتياجاتهم.

على سبيل المثال، استخدمت تطبيقا واحدا يتم تحميل فئاته من LDAP: S

تحتاج التطبيقات الأخرى إلى إدارة فئة مستقلة (مثل معظم خوادم التطبيق التي تدعم النشر الساخن)

حول الموارد، هناك طن، في الويب، ببساطة لا يمكن إدراجها.

مثال:

يستخدم Tomcat Webappclasslasloader مخصص لتحميل وعزل الفئات / الجرار من تطبيقات الويب المختلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top