启动类加载器由c++实现、加载rt.jar等核心类、路径固定且java中获取为null;扩展类加载器是java类(extclassloader)、加载ext目录下扩展类、可通过getparent()获取非null实例。

Java 基础类加载器(即启动类加载器 Bootstrap ClassLoader)和扩展类加载器(Extension ClassLoader)最核心的区别在于:谁来实现、加载什么、从哪加载、能否在 Java 代码中获取。
谁实现的?底层语言不同
启动类加载器由 JVM 底层(HotSpot 中是 C++)实现,不属于 Java 类体系,不继承 ClassLoader 抽象类;而扩展类加载器是标准的 Java 类(sun.misc.Launcher$ExtClassLoader),继承自 ClassLoader,可被 Java 代码直接引用。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
加载哪些类?职责边界明确
- 启动类加载器:只负责最核心的 Java 运行时类,如 java.lang.Object、java.lang.String、java.util.ArrayList 等,全部来自 JRE/lib/rt.jar(JDK 8 及之前)或 modules(JDK 9+ 模块化后)
- 扩展类加载器:加载通用但非核心的扩展功能类,比如 javax.crypto.*、javax.xml.* 等,来源是 JRE/lib/ext 目录,或由系统属性 java.ext.dirs 指定的路径
怎么获取?null vs 实例对象
调用 String.class.getClassLoader() 返回 null,因为启动类加载器不在 Java 层面暴露;而扩展类加载器可通过系统类加载器的父加载器拿到:
ClassLoader ext = ClassLoader.getSystemClassLoader().getParent(); // 非 null,可打印、可使用
加载路径与配置方式不同
- 启动类加载器路径固定(如 $JAVA_HOME/jre/lib),修改需用 -Xbootclasspath/a: 参数追加,不推荐直接改 JDK 目录
- 扩展类加载器默认扫描 $JAVA_HOME/jre/lib/ext,也可通过 -Djava.ext.dirs=xxx 覆盖整个目录列表(注意:这是覆盖,不是追加)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










