Class对象

Class对象的创建时间

Class 对象的创建发生在类加载过程的「链接阶段的结束」到「初始化阶段的开始」之间 (主流 HotSpot 虚拟机实现),且一定是在类初始化之前就已创建完成,而非 "加载完后"(加载阶段仅完成二进制字节码加载,尚未形成完整的 Class 对象)。

HotSpot 虚拟机中,Class对象(也叫 "类元信息对象")的创建是加载阶段启动,但链接阶段完成:

  1. 加载阶段 :虚拟机读取字节码后,先在堆内存(注意:方法区存类的运行时数据,Class 对象存堆)创建一个空的 Class 对象雏形,仅记录类的全限定名、父类等基础信息,此时 Class 对象不可用;
  2. 链接阶段(验证 + 准备 + 解析) :虚拟机逐步完善 Class 对象的内容(如静态变量的内存地址、方法的直接引用、接口信息等);
  3. 链接阶段结束后、初始化阶段开始前 :Class 对象完全创建完成,此时可以通过Class.forName()、类名.class等方式获取到这个对象,但类的静态变量还未执行用户指定的赋值(初始化阶段才做)。

方法区存类的运行时数据,Class 对象存堆

java 复制代码
public class ClassObjectTiming {
    // 静态变量(初始化阶段执行赋值)
    public static final String TEST = "初始化完成";

    static {
        System.out.println("执行静态代码块(初始化阶段)");
    }

    public static void main(String[] args) throws ClassNotFoundException {
        // 方式1:通过类名.class获取Class对象(仅触发加载+链接,不触发初始化)
        Class<ClassObjectTiming> clazz1 = ClassObjectTiming.class;
        System.out.println("获取Class对象:" + clazz1.getName());
        System.out.println("此时静态变量值:" + clazz1.getField("TEST").get(null)); // 能获取到默认值/常量值,但未执行静态代码块

        // 方式2:Class.forName(类名, false, 类加载器) ------ false表示不触发初始化
        Class<?> clazz2 = Class.forName("ClassObjectTiming", false, ClassObjectTiming.class.getClassLoader());
        System.out.println("再次获取Class对象:" + clazz2.getName());

        // 方式3:Class.forName(类名) ------ 触发初始化
        Class<?> clazz3 = Class.forName("ClassObjectTiming");
        System.out.println("初始化后获取:" + clazz3.getName());
    }
}
output:
获取Class对象:ClassObjectTiming
此时静态变量值:初始化完成
再次获取Class对象:ClassObjectTiming
执行静态代码块(初始化阶段)
初始化后获取:ClassObjectTiming

常见误区澄清

  1. 误区 1:"加载完就创建 Class 对象"

    → 加载阶段仅生成 Class 对象雏形,链接阶段(验证 / 准备 / 解析)才完成 Class 对象的初始化,加载阶段结束后 Class 对象尚未就绪;

  2. 误区 2:"Class 对象在方法区"

    → HotSpot 中,类的运行时数据(如常量池、方法信息)存在方法区(元空间),但Class对象本身存放在堆内存中;

  3. 误区 3:"获取 Class 对象就等于类初始化"

    → 只有触发《Java 虚拟机规范》中规定的 5 种 "主动使用" 场景(如 new 实例、调用静态方法、反射且不指定不初始化),才会触发初始化,单纯获取 Class 对象(如类名.class)仅触发加载 + 链接。

相关推荐
三84411 分钟前
Fastjson 漏洞 · 02 · autoType 机制与 checkAutoType
java·fastjson
无限码力35 分钟前
小红书笔试真题 9.17 - 待发热度重排(C++/Py/Java /Js/Go)
java·小红书·小红书笔试真题·小红书技术岗笔试真题
卓怡学长41 分钟前
w194基于ssm新能源汽车充电系统小程序
java·小程序·intellij-idea
JAVA面经实录9171 小时前
Java高级后端 · 全套面试通关手册(MySQL)
java·mysql·面试
光依旧1 小时前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
弹简特2 小时前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖2 小时前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran2 小时前
Spring IoC和DI概念篇
java·后端·spring
小狼154543 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript