java类加载器加载的是类定义而非对象,先将.class字节码载入方法区并生成堆中的class对象,再经验证、准备、解析、初始化后,方可通过new等创建实例对象。

Java 类加载器加载类,不是直接加载“对象”,而是把 .class 文件的字节码加载进 JVM 内存,生成一个 java.lang.Class 对象——这个 Class 对象才是后续创建实例对象(比如 new A())的前提。
简单说:加载的是类定义,不是对象;对象是在类初始化之后、由 new 或反射等触发时才创建的。
类加载器怎么加载类
类加载器通过三个核心动作完成类的加载:
-
查找字节码:根据类的全限定名(如
java.lang.String),从指定位置(磁盘、JAR、网络、内存生成等)获取二进制字节流; - 载入方法区:把字节流解析成 JVM 能识别的运行时数据结构,存入方法区(JDK 8+ 是元空间);
-
创建 Class 对象:在堆中生成一个
java.lang.Class实例,作为该类在 Java 层的唯一代表,所有对该类的反射、类型判断、instanceof等操作都依赖它。
这个过程发生在「加载(Loading)」阶段,是整个类加载生命周期的第一步。
类加载的完整流程(加载 → 链接 → 初始化)
类真正可用前,必须走完以下关键阶段:
-
加载(Loading)
- 查找
.class文件(路径由类加载器决定); - 读入字节码,生成运行时数据结构;
- 创建
Class对象(位于堆中,指向方法区里的类元数据)。
- 查找
-
链接(Linking)
- 验证(Verification):检查字节码是否合规(格式、语义、安全);
-
准备(Preparation):为静态变量分配内存,并设默认值(如
int x;→x = 0); -
解析(Resolution):把符号引用(如
"java/lang/Object")转为直接内存地址引用。
-
初始化(Initialization)
- 执行
<clinit></clinit>方法:包括静态变量显式赋值(如static int x = 5;)和静态代码块; - JVM 保证线程安全,只执行一次;
- 此阶段完成后,类才算真正“准备好被使用”。
- 执行
注意:只有当类被「首次主动使用」时,才会触发初始化。例如:
new A()、A.staticMethod()、A.staticField、Class.forName("A")、子类初始化时父类未初始化等。
类加载器的分工与协作(双亲委派模型)
Java 使用分层类加载器,按优先级自上而下委托:
-
Bootstrap ClassLoader(启动类加载器)
- C++ 实现,无 Java 对应实例;
- 加载
rt.jar等核心类(java.*包); - 没有父加载器。
-
Extension ClassLoader(扩展类加载器)
- 加载
<java_home>/jre/lib/ext</java_home>下的 JAR; - 父加载器是 Bootstrap。
- 加载
-
Application ClassLoader(应用类加载器)
- 加载
-classpath或CLASSPATH指定路径下的类; - 父加载器是 Extension;
- 默认的用户类加载器。
- 加载
-
自定义 ClassLoader
- 继承
ClassLoader,重写findClass()(不建议重写loadClass(),以免破坏双亲委派); - 用于热部署、加密类加载、插件隔离等场景。
- 继承
双亲委派的意义:
- 防止重复加载(同一类由同一加载器加载);
- 保障安全性(比如你写个
java.lang.String,不会被加载,因为 Bootstrap 已加载过)。
类加载后,对象是怎么创建的?
类加载并初始化完毕后,才能创建实例对象:
-
new A():JVM 检查A.class是否已加载初始化;若否,触发类加载流程;若是,则在堆中分配内存、填充对象头、执行<init></init>方法(构造器); -
Class.newInstance()或Constructor.newInstance():同样依赖已初始化的Class对象; - 所有对象实例都共享同一个
Class对象(即obj.getClass() == A.class成立)。
注意:数组类(如 int[]、String[])不由类加载器加载,而是 JVM 在运行时动态生成,其 getClass().getClassLoader() 返回的是元素类型的加载器。
不复杂但容易忽略:类加载是“按需触发”的,不是程序一启动就把所有类全拉进来;对象创建是“基于已加载类”的独立行为,两者时间上分离、职责上清晰。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











