类加载器采用委托优先的层级结构而非继承关系,启动类加载器(C/C++实现,Java中为null)加载$JAVA_HOME/jre/lib/rt.jar等java.*核心类;扩展类加载器加载$JAVA_HOME/jre/lib/ext下javax.*等扩展类;系统类加载器加载ClassPath路径下的应用类,三者共同支撑双亲委派机制以保障安全与一致性。

类加载器的层级关系不是简单的父子继承,而是一种委托优先的协作结构,核心目的是保障安全与一致性。启动类加载器最顶层,系统类加载器最贴近应用代码,三者职责分明、边界清晰。
启动类加载器(Bootstrap ClassLoader)
它由C/C++实现,不继承自java.lang.ClassLoader,因此在Java代码中表现为null。它的唯一任务是加载JVM运行所依赖的最基础类库:
- 路径固定:通常是$JAVA_HOME/jre/lib/rt.jar等核心jar包
- 覆盖范围:java.*开头的类,如java.lang.Object、java.util.ArrayList
- 不可替换:开发者无法直接使用或重写它,它是JVM启动时硬编码绑定的
扩展类加载器(Extension ClassLoader)
由Java语言编写,父加载器是启动类加载器,负责加载标准扩展机制下的类:
- 默认路径:$JAVA_HOME/jre/lib/ext目录,或由java.ext.dirs系统属性指定的位置
- 典型内容:如javax.*相关类、部分安全框架、国际化支持库等
- 设计初衷:让JRE具备可插拔性,无需修改JVM本身就能引入新功能
系统类加载器(Application/System ClassLoader)
也叫应用程序类加载器,是默认的用户代码加载器,父加载器是扩展类加载器:
- 加载来源:ClassPath环境变量或-cp参数指定的路径,包括当前目录、jar包、class文件等
- 实际作用:绝大多数你自己写的类、第三方依赖(如Spring、Log4j)都由它加载
- 可获取:通过ClassLoader.getSystemClassLoader()能拿到它的实例,常作为自定义加载器的默认父加载器
这种分层不是为了“分工干活”,而是为双亲委派机制服务——每个加载请求都先向上委托,只有父加载器明确表示“找不到”,子加载器才尝试自己加载。这样既防止用户代码替换核心类,也避免重复加载同一类。










