日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java static 块 时机_java的static块执行时机

發(fā)布時間:2024/9/27 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java static 块 时机_java的static块执行时机 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

之前一直認為static塊是在class load的時候執(zhí)行,今天在驗證Spring初始化Context loader的時候,發(fā)現(xiàn)bean的static塊并沒有執(zhí)行。

Class A{

static{

System.out.println("static block invoked!")

}

}

那么static塊到底在什么時候運行的呢?如果了解JVM原理,我們知道,一個類的運行分為以下步驟:

裝載

連接

初始化

其中裝載階段又三個基本動作組成:

通過類型的完全限定名,產(chǎn)生一個代表該類型的二進制數(shù)據(jù)流

解析這個二進制數(shù)據(jù)流為方法區(qū)內(nèi)的內(nèi)部數(shù)據(jù)結構

創(chuàng)建一個表示該類型的java.lang.Class類的實例

另外如果一個類裝載器在預先裝載的時遇到缺失或錯誤的class文件,它需要等到程序首次主動使用該類時才報告錯誤。

連接階段又分為三部分:

驗證,確認類型符合Java語言的語義,檢查各個類之間的二進制兼容性(比如final的類不用擁有子類等),另外還需要進行符號引用的驗證。

準備,Java虛擬機為類變量分配內(nèi)存,設置默認初始值。

解析(可選的) ,在類型的常量池中尋找類,接口,字段和方法的符號引用,把這些符號引用替換成直接引用的過程。

當一個類被主動使用時,Java虛擬就會對其初始化,如下六種情況為主動使用:

當創(chuàng)建某個類的新實例時(如通過new或者反射,克隆,反序列化等)

當調(diào)用某個類的靜態(tài)方法時

當使用某個類或接口的靜態(tài)字段時

當調(diào)用Java API中的某些反射方法時,比如類Class中的方法,或者java.lang.reflect中的類的方法時

當初始化某個子類時

當虛擬機啟動某個被標明為啟動類的類(即包含main方法的那個類)

Java編譯器會收集所有的類變量初始化語句和類型的靜態(tài)初始化器,將這些放到一個特殊的方法中:clinit。

實際上,static塊的執(zhí)行發(fā)生在“初始化”的階段。初始化階段,jvm主要完成對靜態(tài)變量的初始化,靜態(tài)塊執(zhí)行等工作。

下面我們看看執(zhí)行static塊的幾種情況:

1、第一次new A()的過程會打印"";因為這個過程包括了初始化

2、第一次Class.forName("A")的過程會打印"";因為這個過程相當于Class.forName("A",true,this.getClass().getClassLoader());

3、第一次Class.forName("A",false,this.getClass().getClassLoader())的過程則不會打印""。因為false指明了裝載類的過程中,不進行初始化。不初始化則不會執(zhí)行static塊。

參考資料:深入Java虛擬機

總結

以上是生活随笔為你收集整理的java static 块 时机_java的static块执行时机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。