java类加载器采用三层分层结构:启动类加载器(c/c++实现,加载rt.jar等核心类)、扩展类加载器(加载ext目录扩展类)、系统类加载器(加载classpath用户类),严格遵循双亲委派模型保障类型安全。

Java类加载器采用分层结构,核心是三层内置加载器,它们按信任等级和职责范围自上而下组织,共同支撑JVM的类型安全与动态加载能力。
启动类加载器(Bootstrap ClassLoader)
这是最顶层的加载器,由JVM自身用C/C++实现,不继承java.lang.ClassLoader,因此在Java代码中无法直接引用(调用ClassLoader.getSystemClassLoader().getParent()返回null)。它负责加载JAVA_HOME/jre/lib目录下的核心类库,例如rt.jar、resources.jar、charsets.jar等,涵盖java.lang.*、java.util.*、java.io.*等基础包。这些类被JVM视为“可信基石”,具备最高加载优先级和运行时特权。
扩展类加载器(Extension ClassLoader)
由Java语言编写,父类为Bootstrap ClassLoader,其具体实现类是sun.misc.Launcher$ExtClassLoader(JDK 8及以前)或jdk.internal.loader.ClassLoaders$PlatformClassLoader(JDK 9+模块化后有所调整)。它负责加载JAVA_HOME/jre/lib/ext目录(或由系统属性java.ext.dirs指定路径)中的JAR包。典型内容包括XML解析器、DNS工具、安全服务提供者等标准扩展类。该层起到承上启下的作用:既避免污染Bootstrap层,又为应用层提供可插拔的标准化扩展支持。
系统类加载器(Application ClassLoader,也称App ClassLoader)
同样由Java实现,父类为Extension ClassLoader,对应类为sun.misc.Launcher$AppClassLoader(JDK 8)或jdk.internal.loader.ClassLoaders$AppClassLoader(JDK 9+)。它是应用程序默认的类加载器,负责加载环境变量CLASSPATH所指定路径(包括当前目录、JAR包、classes目录等)下的用户类。开发者通过ClassLoader.getSystemClassLoader()获取的就是它。绝大多数自定义类、第三方依赖(如Spring、Log4j)都经由此加载器载入,是开发中最常接触、也最易被自定义覆盖的一层。
这三层并非孤立运作,而是严格遵循双亲委派模型:每个加载器在收到类加载请求时,先委托父加载器尝试加载;仅当父加载器无法定位该类(返回null)时,才由自己查找并定义。这种机制保障了核心类(如java.lang.String)不会被用户代码篡改,从根源上防止类型冲突与安全风险。











