启动类加载器(bootstrap classloader)负责加载java基础类(如object、string、arraylist所依赖的核心类型),因其由c++实现、嵌入jvm内部,加载/jre/lib/rt.jar(jdk8)或java.base模块(jdk9+)中的核心类,确保安全性、稳定性和一致性,且java层无法获取其引用。

Java 基础类(比如 java.lang.Object、java.lang.String、java.util.ArrayList 等)由启动类加载器(Bootstrap ClassLoader)加载,核心原因是:它们属于 JDK 最底层、最可信的运行时核心类库,必须在 JVM 启动最早期就可用,且不能被用户代码干预或替换。
下面分几个关键点讲清楚这个过程:
启动类加载器只加载特定路径下的核心类
- 默认加载
<java_home>/jre/lib/</java_home>(或 JDK 9+ 的lib/目录下模块化系统中的关键模块,如java.base)中的类文件 - 典型资源包括:
-
rt.jar(JDK 8 及以前,含全部java.*和javax.*核心类) -
resources.jar、charsets.jar、jdk.crypto.*等(按版本略有差异) - JDK 9+ 中被模块化后,由
java.base模块提供Object、Class、ClassLoader等基础类型
-
✅ 验证方式:
System.getProperty("sun.boot.class.path")可查看实际加载路径(JDK 8),JDK 9+ 后该属性可能为空或不推荐使用,但模块信息可通过--list-modules查看。
启动类加载器是 JVM 内置的,不是 Java 类
- 它由 C++ 实现,嵌入在 HotSpot 虚拟机内部,不属于
java.lang.ClassLoader的子类 - 因此无法在 Java 层直接引用或实例化
- 调用
String.class.getClassLoader()返回null,不是 bug,而是设计使然——表示“由 Bootstrap 加载”
JVM 启动时自动触发加载,无需显式干预
- JVM 进程一启动,就会用 Bootstrap ClassLoader 加载
java.lang.Object—— 因为所有类都隐式继承它,它是整个类继承体系的根 - 接着加载
java.lang.Class、java.lang.ClassLoader、java.lang.System等,为后续扩展类加载器和系统类加载器的创建打下基础 -
main方法所在的类(如MyApp)虽由系统类加载器加载,但它的父类、所用的基础类型(String[]、PrintStream等)早已由 Bootstrap 加载完毕
为什么不允许用户替换这些类?
- 安全性:防止恶意代码篡改
SecurityManager、Class或ClassLoader的行为 - 稳定性:若
Object的hashCode()或getClass()行为被修改,整个 JVM 逻辑会崩溃 - 一致性:确保所有 JVM 实现对基础语义的理解完全统一
所以,你写 new ArrayList() 时,ArrayList 类本身由系统类加载器加载(因在 classpath 中),但它继承的 AbstractList、实现的 List 接口、依赖的 Object 和 Class,全是由启动类加载器提前、静默、可靠地加载进内存的。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











