Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cơ chế hoạt động của ClassLoader trong Java

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

  1. Bootstrap ClassLoader (Native/C++) – load core JDK classes (java.lang.*, java.util.*... từ rt.jar). Không có parent.
  2. Extension ClassLoader (Java 8-) / Platform ClassLoader (Java 9+) – load extension jars (jre/lib/ext hoặc module platform). Parent = Bootstrap.
  3. 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:

  1. Đệ quy hỏi parent trước.
  2. Nếu parent load được → trả về.
  3. 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...).