java的static块执行时机
之前一直認為static塊是在class load的時候執行,今天在驗證Spring初始化Context loader的時候,發現bean的static塊并沒有執行。
Class A{ static{System.out.println("static block invoked!")}}那么static塊到底在什么時候運行的呢?如果了解JVM原理,我們知道,一個類的運行分為以下步驟:
其中裝載階段又三個基本動作組成:
?另外如果一個類裝載器在預先裝載的時遇到缺失或錯誤的class文件,它需要等到程序首次主動使用該類時才報告錯誤。
?連接階段又分為三部分:
當一個類被主動使用時,Java虛擬就會對其初始化,如下六種情況為主動使用:
??Java編譯器會收集所有的類變量初始化語句和類型的靜態初始化器,將這些放到一個特殊的方法中:clinit。
實際上,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塊。
參考資料:深入Java虛擬機
總結
以上是生活随笔為你收集整理的java的static块执行时机的全部內容,希望文章能夠幫你解決所遇到的問題。