هناك طريقتان شائعتا الاستخدام لتحميل ملفات الموارد:
1. استخدم ClassLoader في هذه المرحلة، يجب أن أذكر تصنيف ClassLoader. هناك ثلاثة أنواع رئيسية من ClassLoader المضمنة في Java.
الأول هو مُحمل فئة الجذر (مُحمل فئة bootstrap)، المكتوب بلغة C++، وهو المسؤول عن تحميل بعض فئات Java الرئيسية، مثل java.lang.Object ورموز وقت التشغيل الأخرى في الذاكرة. الحزمة المسؤولة عن التحميل: BootStrp------>JRE/lib/rt.jar
والثاني هو مُحمل الفئة الموسعة (ExtClassLoader)، والذي تتم كتابته بواسطة فئة Java وهو المسؤول عن تحميل بعض الفئات في JRE إلى الذاكرة. الحزمة المسؤولة عن التحميل: ExtClassLoader--------->JRE/lib/ext/*.jar
النوع الثالث هو مُحمل فئة التطبيق (AppClassLoader)، أو مُحمل فئة النظام، وهو المسؤول عن تحميل الفئات في CLASSPATH في الذاكرة. يمكن الحصول على مُحمل فئة التطبيق من خلال ClassLoader.getSystemClassLoader();
لنتحدث عن وراثة مُحمل الفئة. لا تعد مُحمل الفئة علاقة موروثة رأسية بين الوالدين والطفل، ولكنها علاقة مركبة عند إنشاء مُحمل فئة، يمكن تمرير مثيل مُحمل الفئة الأصل إلى مُحمل الفئة كإنشاء المعلمة في السفينة
للحصول على معلومات مفصلة حول أدوات تحميل الفئة، يمكنك البحث بنفسك.
بعد الحصول على محمل فئة التطبيق، حان الوقت للحصول على ملف المورد. اتصل بـloader.getResource(path) لتحميل ملف المورد ضمن المسار المقابل، ولا يمكن البدء بـ "/". تعامل مع الحزمة كمجلد عادي، وافصل كل حزمة باستخدام "/".
على سبيل المثال: URL url2 = ClassLoader.getSystemClassLoader().getResource("demo/names.ser"); هو الحصول على ملف تسلسل faces.ser في الحزمة التجريبية.
2. استخدم طريقة getResource للفئة الحالية التي يجب تحميلها للتحميل في الواقع، تستدعي هذه الطريقة أيضًا مُحمل الفئة الذي يقوم بتحميل هذه الفئة للحصول على ملف المورد، لكن المعلمات التي تم الحصول عليها مختلفة.
(1) إذا كنت ترغب في الحصول على الملفات الموجودة في الحزمة التي يوجد بها الفصل، فيمكنك استخدام المسارات النسبية للوصول مباشرة إلى الموارد الموجودة في الحزمة؛ على سبيل المثال: Demo1.class.getResource("names.ser"); التي تحصل عليها هي الموارد الموجودة في الحزمة حيث يوجد ملف فئة Demo1.
(2) للحصول على ملفات الموارد خارج الحزمة، يجب أن تبدأ بـ "/"، مثل URL url = Demo1.class.getResource("/demo/names.ser"); الحزمة التجريبية
في الواقع، الطريقة الثانية عبارة عن تغليف للطريقة الأولى، وكلاهما يستخدم ClassLoader لتحميل ملفات الموارد. لماذا تقول ذلك؟ إذا نظرت إلى الكود المصدري لفئة Class، ستعرف: