以前一直認爲static塊是在class load的時候執行,今天在驗證Spring初始化Context loader的時候,發現bean的static塊並無執行。java
Class A{ static{ System.out.println("static block invoked!") } }
那麼static塊到底在何時運行的呢?若是瞭解JVM原理,咱們知道,一個類的運行分爲如下步驟:數據結構
其中裝載階段又三個基本動做組成:jvm
另外若是一個類裝載器在預先裝載的時遇到缺失或錯誤的class文件,它須要等到程序首次主動使用該類時才報告錯誤。this
鏈接階段又分爲三部分:code
當一個類被主動使用時,Java虛擬就會對其初始化,以下六種狀況爲主動使用:接口
Java編譯器會收集全部的類變量初始化語句和類型的靜態初始化器,將這些放到一個特殊的方法中:clinit。內存
實際上,static塊的執行發生在「初始化」的階段。初始化階段,jvm主要完成對靜態變量的初始化,靜態塊執行等工做。get
下面咱們看看執行static塊的幾種狀況:
一、第一次new A()的過程會打印"";由於這個過程包括了初始化
二、第一次Class.forName("A")的過程會打印"";由於這個過程至關於Class.forName("A",true,this.getClass().getClassLoader());
三、第一次Class.forName("A",false,this.getClass().getClassLoader())的過程則不會打印""。由於false指明瞭裝載類的過程當中,不進行初始化。不初始化則不會執行static塊。編譯器
參考資料:深刻Java虛擬機虛擬機