类加载第一阶段的“物理转化”本质是语义重建,即将静态二进制字节流解析为方法区中带运行时语义的数据结构(如运行时常量池、字段/方法元数据、类层次指针等),并生成class对象作为访问入口,而非简单复制.class文件。

类加载第一阶段的“物理转化”,本质不是字节复制,而是语义重建——把静态的、平台无关的二进制描述,变成JVM能直接调度的、带运行时语义的内存结构。
这个过程不等于“把.class文件整个拷进内存”,而是在方法区中按需构造一套虚拟机可识别的数据模型。关键在于三点:
字节流只是原料,不是成品
.class文件是编译器生成的线性二进制序列(含魔数、版本号、常量池、字段表、方法表等),它本身没有内存布局、没有指针、不区分线程共享或私有。JVM读取后,并不会原样存入方法区,而是逐段解析、校验、重组。-
方法区中构建的是“运行时数据结构”
比如:- 常量池 → 转为方法区内的运行时常量池(支持动态解析、具备符号引用与直接引用转换能力);
- 字段表 → 构建类字段元数据结构(含访问标志、类型描述符、初始值、是否被static/final修饰等);
- 方法表 → 解析出方法结构体(含字节码、局部变量表大小、操作数栈深度、异常表、注解信息等),并可能触发即时编译器预处理;
- 类继承关系 → 建立类层次结构指针(如指向父类Class对象、实现的接口列表、虚方法表vtable或接口方法表itable)。
-
Class对象是“句柄”,不是“副本”
在HotSpot虚拟机中,java.lang.Class实例本身通常存放在方法区(元空间),而非堆中(早期JDK7及以前才在永久代/堆)。它不保存类的全部数据,而是作为访问方法区内存结构的统一入口和控制中心:- 提供
getDeclaredMethods()等API时,实际是从方法区对应结构中动态组装返回; - 静态字段的值存储在方法区的“类变量区”,
Class对象仅持有对其的引用或偏移量; - 所有对该类的反射、实例化、字段访问,最终都通过这个
Class对象间接定位到方法区的真实数据结构。
- 提供
简单说:
二进制字节流是“图纸”,方法区结构是“已建成的工厂”,
Class对象是“厂牌铭牌+总控台”。
图纸不会被贴在墙上展示,而是由工程师(类加载器+JVM)按图施工,搭起真实的厂房、流水线、控制系统——这才是“物理转化”的真实含义。
这个转化完成后,类才真正“活”在JVM里,具备被链接、初始化、调用的能力。











