การโหลดไฟล์ทรัพยากรที่ใช้กันทั่วไปมีสองวิธี:
1. ใช้ ClassLoader ณ จุดนี้ ฉันต้องพูดถึงการแบ่งประเภทของ ClassLoader มีสามประเภทหลักๆ ของ ClassLoader ที่สร้างไว้ใน Java
อย่างแรกคือตัวโหลดคลาสรูท (ตัวโหลดคลาสบูตสแตรป) ซึ่งเขียนด้วยภาษา 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"); คือการรับไฟล์การทำให้เป็นอนุกรมของ name.ser ในแพ็คเกจสาธิต
2. ใช้เมธอด getResource ของคลาสปัจจุบันที่ต้องโหลดเพื่อโหลด จริงๆ แล้ว เมธอดนี้ยังเรียกคลาสโหลดเดอร์ที่โหลดคลาสนี้เพื่อรับไฟล์ทรัพยากร แต่พารามิเตอร์ที่ได้รับจะแตกต่างกัน
(1) หากคุณต้องการรับไฟล์ในแพ็คเกจที่มีคลาสอยู่ คุณสามารถใช้พาธสัมพัทธ์เพื่อเข้าถึงทรัพยากรในแพ็คเกจได้โดยตรง ตัวอย่างเช่น Demo1.class.getResource("names.ser"); คุณได้รับคือทรัพยากรในแพ็คเกจซึ่งเป็นที่ตั้งของไฟล์คลาสของ Demo1
(2) หากต้องการรับไฟล์ทรัพยากรภายนอกแพ็คเกจ ต้องขึ้นต้นด้วย '/' เช่น URL url = Demo1.class.getResource("/demo/names.ser"); สิ่งที่ได้รับคือไฟล์ name.ser แพ็คเกจสาธิต
ที่จริงแล้ว วิธีที่สองเป็นการห่อหุ้มวิธีแรก และทั้งสองวิธีใช้ ClassLoader เพื่อโหลดไฟล์ทรัพยากร ทำไมคุณถึงพูดอย่างนั้น? หากคุณดูซอร์สโค้ดของคลาส Class คุณจะรู้ว่า: