ClassLoader là gì?
Chịu trách nhiệm **load class** (đọc bytecode từ .class file) vào bộ nhớ khi cần. Hoạt động theo mô hình **delegation (ủy quyền)** phân cấp:
3 loại ClassLoader chuẩn
- Bootstrap ClassLoader (Native/C++) – load core JDK classes (
java.lang.*,java.util.*... từrt.jar). Không có parent. - Extension ClassLoader (Java 8-) / Platform ClassLoader (Java 9+) – load extension jars (
jre/lib/exthoặc module platform). Parent = Bootstrap. - System/Application ClassLoader – load classpath của ứng dụng (
-cp,CLASSPATH). Parent = Extension/Platform.
Quy tắc Delegation
Khi nhận request load class:
- Đệ quy hỏi parent trước.
- Nếu parent load được → trả về.
- Nếu parent không tìm thấy → tự load.
Đảm bảo core classes không bị ghi đè bởi class cùng tên trong ứng dụng (security).
Ví dụ in ClassLoader của các class
public class ClassLoaderDemo {
public static void main(String[] args) {
System.out.println("ClassLoader của class này: " + ClassLoaderDemo.class.getClassLoader());
// sun.misc.Launcher$AppClassLoader@... (System CL)
System.out.println("ClassLoader của DNSNameService: " +
sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());
// sun.misc.Launcher$ExtClassLoader@... (Extension CL)
System.out.println("ClassLoader của HashMap: " +
java.util.HashMap.class.getClassLoader());
// null → Bootstrap ClassLoader
}
}
Kết quả
ClassLoader của class này: sun.misc.Launcher$AppClassLoader@73d16e93
ClassLoader của DNSNameService: sun.misc.Launcher$ExtClassLoader@70dea4e
ClassLoader của HashMap: null
Custom ClassLoader
Kế thừa ClassLoader, override findClass(String name) để load từ nguồn tùy chỉnh (network, database, encrypted file...).