類的生命周期
image.png
加載洋丐、驗證淑掌、準備蒿讥、初始化、卸載這5個階段的順序是確定的抛腕,類加載過程必須按照這種順序按部就班的開始芋绸,而解析階段不一定:在某些情況下它可以在初始化階段之后再開始,這是為了支持Java語言的運行時綁定(也稱為動態(tài)綁定或晚期綁定)担敌。
注:按部就班的開始摔敛,而不是按部就班的進行或者完成,是因為這些階段通常都是互相交叉地混合式進行全封,通常會在一個階段執(zhí)行過程中調(diào)用舷夺、激活另外一個階段苦酱。
第一階段加載,虛擬機規(guī)范并沒有進行強約束给猾,由虛擬機具體實現(xiàn)自由把握疫萤,但是初始化階段,虛擬機規(guī)范嚴格定義有且只有5種情況必須立即對類進行“初始化”:
1)遇到new敢伸、getstatic扯饶、putstatic、或invokestatic這4條字節(jié)碼指令時池颈,如果類沒有進行過初始化尾序,則需要先觸發(fā)初始化;
2)使用java.lang.reflect包的方法對類進行反射調(diào)用時躯砰,如果類沒有進行過初始化每币,則需要先觸發(fā)初始化;
3)當初始化一個類時琢歇,如果發(fā)現(xiàn)其父類沒有進行過初始化兰怠,則需要先觸發(fā)其父類初始化;
4)當虛擬機啟動時李茫,用戶需要指定一個要執(zhí)行的主類(包含main()方法的那個類)揭保,虛擬機會先初始化這個主類;
5)使用JDK1.7的動態(tài)語言支持時魄宏,如果一個java.lang.invoke.MethodHandle實例最后的解析結(jié)果是