Skip to content

JDK类加载器机制详解

JDK提供了三层嵌套的类加载器体系结构,默认情况下分为以下三个层次:

1. Bootstrap ClassLoader

  • 功能定位:JVM启动类加载器,负责加载Java核心API的核心类文件(如java.lang.Object等)
  • 职责说明
    • 负责初始化JVM运行环境
    • 加载位于JAVA_HOME/jre/lib/rt.jar目录下的基础类库
  • 特点
    • JVM启动时最先加载的类加载器
    • 使用C语言实现,无法直接通过Java代码获取实例

2. ExtClassLoader

  • 功能定位:扩展类加载器,负责处理JDK的可选组件和第三方扩展包
  • 职责说明
    • 负责加载JAVA_HOME/jre/lib/ext/目录下的JAR文件中的类
    • 支持通过系统属性java.ext.dirs进行配置
  • 特点
    • 可以被Java代码获取和使用

3. AppClassLoader(Application ClassLoader)

  • 功能定位:应用程序类加载器,负责处理用户编写的程序代码
  • 职责说明
    • 负责从classpath环境变量指定的路径中加载类文件
    • 是所有自定义类加载器的默认父加载器
  • 特点
    • Java语言级别的默认类加载器
    • 可以通过ClassLoader.getSystemClassLoader()方法获取实例

使用示例代码:

java
public class ClassLoaderDemo {
    public static void main(String[] args) throws Exception {
        // 获取ExtClassLoader实例
        ClassLoader extLoader = Ext.class.getClassLoader();
        System.out.println("ExtClassLoader: " + extLoader);

        // 获取AppClassLoader实例
        ClassLoader appLoader = App.class.getClassLoader();
        System.out.println("Application ClassLoader: " + appLoader);
        
        // 动态加载类示例:使用URLClassLoader实现自定义资源加载
        URL url = new URL("file:///path/to/your.jar");
        ClassLoader customLoader = new URLClassLoader(new URL[]{url}, App.class.getClassLoader());
        try {
            Class<?> clazz = customLoader.loadClass("com.example.MyClass");
            Object instance = clazz.newInstance();
            System.out.println(instance);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public static class Ext {}
    public static class App {}
}

总结

  • 层次关系:Bootstrap ClassLoader -> ExtClassLoader -> AppClassLoader
  • 职责划分
    • Bootstrap负责JVM核心类加载
    • Ext负责扩展功能模块的加载
    • App负责用户应用程序代码的加载