我有这段代码,我正在使用 -verbose:class 选项运行它以查看加载的类。令我惊讶的是,它显示它加载了 A1 和 A2 类,但未调用静态块。有人可以解释这种行为吗package P1;import java.lang.reflect.InvocationTargetException;public class DemoReflection { static { System.out.println("Loading Demo"); } public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { System.out.println("A2 " + A2.class.getClassLoader().getClass()); System.out.println("Demo " + DemoReflection.class.getClassLoader().getClass()); System.out.println("A1 " + A1.class.getClassLoader().getClass()); }}class A1 { static { System.out.println("Loading A1"); }}class A2 extends A1 { static { System.out.println("Loading A2"); } public A2() { System.out.println("m2"); } public void m1() { System.out.println("m1"); }}class A3 { static int a3Id = 3; static { System.out.println("Loading A3"); }}输出:
2 回答
湖上湖
TA贡献2003条经验 获得超2个赞
JLS §8.7说:
在类中声明的静态初始值设定项在类初始化时执行(第 12.4.2 节)。
那么初始化是什么意思呢?让我们参考JLS §12.4.2。这描述了详细的初始化过程。然而, JLS §12.4.1点在这里可能更合适。它说:
类或接口类型 T 将在以下任何一项第一次出现之前立即初始化:
T 是一个类,并且创建了 T 的一个实例。
T 是一个类,调用了 T 声明的静态方法。
分配了 T 声明的静态字段。
使用了由 T 声明的静态字段,并且该字段不是常量变量(第 4.12.4 节)。
T 是顶级类(§7.6),执行词法嵌套在 T(§8.1.3)中的断言语句(§14.10)。
这些选项均不适用于您的情况,因此不会调用静态块。
添加回答
举报
0/150
提交
取消