类加载器(ClassLoader)是Java虚拟机(JVM)的核心组件之一,负责将.class文件加载到内存并转换成JVM能够使用的Java类。理解类加载器的工作机制对于掌握Java的动态加载特性、实现热部署以及解决类冲突等问题至关重要。
一、类加载器的基本概念
1. 类加载器的核心职责
- 加载(Loading):查找并读取.class文件的二进制数据
- 链接(Linking):
- 验证:确保类文件符合JVM规范
- 准备:为静态变量分配内存并初始化默认值
- 解析:将符号引用转换为直接引用
- 初始化(Initialization):执行静态代码块和静态变量赋值
2. 类加载器的特点
- 层级结构:采用父委托模型(Parent Delegation)
- 唯一性:同一个类被不同加载器加载会被视为不同类
- 动态性:运行时可以动态加载类
二、Java内置的类加载器种类
Java虚拟机提供了三类主要的类加载器,它们共同构成了层级式的类加载体系:
1. 启动类加载器(Bootstrap ClassLoader)
特点:
- 最顶层的类加载器,由C++实现(Java中显示为null)
- 负责加载JAVA_HOME/lib目录下的核心类库(如rt.jar)
- 不继承java.lang.ClassLoader
加载路径:
System.getProperty("sun.boot.class.path")
// 典型输出:/usr/lib/jvm/java-8-openjdk/jre/lib/resources.jar:/usr/lib/jvm/java-8-openjdk/jre/lib/rt.jar...
2. 扩展类加载器(Extension ClassLoader)
特点:
- 由sun.misc.Launcher$ExtClassLoader实现
- 父加载器是Bootstrap ClassLoader
- 负责加载JAVA_HOME/lib/ext目录下的扩展jar包
加载路径:
System.getProperty("java.ext.dirs")
// 典型输出:/usr/lib/jvm/java-8-openjdk/jre/lib/ext...
3. 应用程序类加载器(Application ClassLoader)
特点:
- 由sun.misc.Launcher$AppClassLoader实现
- 父加载器是Extension ClassLoader
- 负责加载classpath下的类(用户程序类)
- 可通过ClassLoader.getSystemClassLoader()获取
加载路径:
System.getProperty("java.class.path")
// 输出当前应用的classpath