Appearance
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负责用户应用程序代码的加载