之前一直认为static块是在class load的时候执行,今天在验证Spring初始化Context loader的时候,发现 bean 的static块并没有执行。
Java 代码:
1 Class A{
2 static{
3 System.out.println(" static block invoked!")
4 }
5 }
那么static块到底在什么时候运行的呢?如果了解 JVM 原理,我们知道,一个类的运行分为以下步骤:
实际上,static块的执行发生在“初始化”的阶段。初始化阶段,jvm主要完成对静态变量的初始化,静态块执行等工作。
下面我们看看执行static块的几种情况:
1、第一次new A()的过程会打印””;因为这个过程包括了初始化
2、第一次Class.forName(“A”)的过程会打印””;因为这个过程相当于Class.forName(“A”,true,this.getClass().getClassLoader());
3、第一次Class.forName(“A”,false,this.getClass().getClassLoader())的过程则不会打印””。因为 false 指明了装载类的过程中,不进行初始化。不初始化则不会执行static块。