启动类加载器、扩展类加载器和应用类加载器按双亲委派机制逐级委托:启动类加载器用C++实现,加载java.lang.*等核心类;扩展类加载器加载JAVA_HOME/jre/lib/ext下扩展类;应用类加载器加载classpath中用户代码与第三方库。

启动类加载器、扩展类加载器和应用类加载器各管一块“地盘”,分工明确,互不越界。
启动类加载器(Bootstrap ClassLoader)负责最底层的基石类
它用 C++ 实现,嵌在 JVM 里,不继承 java.lang.ClassLoader,因此在 Java 代码中拿不到它的引用(调用 getClassLoader() 返回 null)。它只加载 JVM 自身运行必需的核心类,比如:
-
java.lang.*(如String、Object、Class) -
java.io.*、java.net.*、java.util.*等基础包中的类 - 来源路径通常是
JAVA_HOME/jre/lib/rt.jar、resources.jar,或由sun.boot.class.path指定
出于安全考虑,它默认只加载以 java.、javax.、sun. 等开头的受信包。
扩展类加载器(Extension ClassLoader)负责 JDK 的可选增强功能
它用 Java 编写(sun.misc.Launcher$ExtClassLoader),父加载器是启动类加载器。它加载的是标准扩展机制下的类库:
立即学习“Java免费学习笔记(深入)”;
- 目录路径:默认为
JAVA_HOME/jre/lib/ext,或由系统属性java.ext.dirs指定 - 典型内容:安全相关的
sun.security.*、国际化支持、某些加密服务提供者等 - 如果你把自定义 JAR 放进
ext目录,它也会被自动加载——但生产环境不推荐这种做法
应用类加载器(Application ClassLoader)负责你写的代码和第三方依赖
也叫系统类加载器(sun.misc.Launcher$AppClassLoader),是程序默认使用的加载器,父加载器是扩展类加载器。它管的是“用户空间”:
- 加载路径来自
classpath或系统属性java.class.path - 包括:你自己编译的
.class文件、Maven 引入的spring-core.jar、log4j.jar等所有业务和框架类 - 可通过
ClassLoader.getSystemClassLoader()在代码中直接获取
绝大多数 Java 应用的类,都由它完成首次加载。
三者不是并列关系,而是按“双亲委派”逐级委托:一个类优先交给父加载器尝试加载,父不行再由子加载——这样既保障核心类不被替换,又实现类的统一视图与隔离基础。


















