为何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
相关产品推荐
相关产品推荐

