You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java中static block未执行?附代码示例求助

为什么A.class没有触发静态块执行?

这个问题的核心在于Java类加载过程中初始化阶段的触发条件——不是所有获取Class对象的方式都会触发类的初始化,咱们一步步拆解:

1. 静态块的执行时机

静态代码块是在类的初始化阶段执行的,而JVM只会在类被主动使用时才会触发初始化。如果只是被动使用类,JVM只会完成类的加载和链接(验证、准备、解析),不会走到初始化这一步。

2. A.class属于被动使用场景

通过类名.class的方式获取Class对象,属于JVM规范中定义的被动使用类的场景,这种操作只会让JVM加载并链接类,但不会触发初始化。所以你的example1方法里,虽然拿到了A的Class对象,但静态块根本没机会执行。

3. Class.forName()的默认行为不同

再看你的example2方法,Class.forName("全类名")的默认调用其实是Class.forName(name, true, 当前类加载器)——第二个参数initialize被设置为true,这会强制触发类的初始化,所以静态块会被执行。

如果把example2里的代码改成下面这样,静态块同样不会执行:

Class<?> class1 = Class.forName("ClassLoading_Interview_Example.ex1.A", false, Main.class.getClassLoader());

直观验证

可以给A类加个静态变量来验证这个区别:

class A {
    static int num = 100;
    static {
        System.out.println("Static Block");
        num = 200;
    }
}

在example1里调用class1.getField("num").getInt(null),你会得到0(这是准备阶段JVM给静态变量赋的默认值);而在example2里执行同样的代码,会得到200(初始化阶段静态块修改后的值)。

内容的提问来源于stack exchange,提问作者Sridhar Srinivasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:08:32