Java Class คอมไพล์เป็น Bytecode ในไฟล์ .class ClassLoader โหลดคลาสเข้าหน่วยความจำเมื่อต้องการ แบบ Hierarchical (ลำดับชั้น) หากมีคำขอโหลด จะมอบหมายให้ Parent ClassLoader ก่อน
ประเภท ClassLoader 3 ระดับ
- Bootstrap ClassLoader - โหลด Core Java Classes (rt.jar) - Native Code
- Extension ClassLoader - โหลด Extensions (jre/lib/ext) - Child ของ Bootstrap
- System/Application ClassLoader - โหลด Classpath ของแอปพลิเคชัน - Child ของ Extension
ตัวอย่าง: ดู ClassLoader ของคลาสต่างๆ
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println("ClassLoader of this class: "
+ ClassLoaderTest.class.getClassLoader());
System.out.println("ClassLoader of DNSNameService: "
+ sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());
System.out.println("ClassLoader of HashMap: "
+ java.util.HashMap.class.getClassLoader());
}
}
ผลลัพธ์
ClassLoader of this class: sun.misc.Launcher$AppClassLoader@73d16e93
ClassLoader of DNSNameService: sun.misc.Launcher$ExtClassLoader@70dea4e
ClassLoader of HashMap: null
คำอธิบาย:
- AppClassLoader (System) โหลดคลาสของเรา
- ExtClassLoader โหลด Extension Classes
- null = Bootstrap ClassLoader (Native, ไม่ใช่ Java Object)
หลักการ Delegation: Child ขอ Parent โหลดก่อน → Parent ไม่เจอ → Child โหลดเอง (ป้องกันโหลดซ้ำและ Security)