static代码块内容执行的时机为 jvm执行类加载 的初始化阶段
如果不进行初始化,则static代码块中的内容不执行
Demo:
class A{
static {
System.out.println("A的静态代码块被调用...");
}
A(){
System.out.println("A被创建...");
}
}
class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// 创建类加载器
final ClassLoader classLoader = ClassLoader.getSystemClassLoader();
// 类加载方式1
classLoader.loadClass("Item.A");
// 类加载方式2
Class<A> aClass = A.class;
// 类加载方式3 - 不指定是否初始化默认为true
Class.forName("Item.A");
// 类加载方式4
Class.forName("Item.A", true, classLoader);
// 类加载方式5
Class.forName("Item.A", false, classLoader);
}
}
上面的5种类加载过程中,只有第3、4种才会执行static静态代码块中的内容,因为这两种指定了需要进行初始化。
其中第三种虽然没有显式指定,源码中也已经指定需要初始化:
参考:
https://www.cnblogs.com/yuebuxichen/p/12120782.html
https://www.cnblogs.com/winterfells/p/7908189.html