前言
什麼情況下會觸發類加載的進行呢?本文將結合代碼demo談談幾種情況,希望對大家有幫助。
類加載時機
什麼情況需要開始類加載過程的第一階段:加載?Java虛擬機規範中並沒有進行強制約束,這點可以交給虛擬機的具體實現來自由把握。但是對於初始化階段,虛擬機規範則嚴格規定了以下幾種情況必須立即對類進行初始化,如果類沒有進行過初始化,則需要先觸發其初始化。
創建類的實例
為了驗證類加載,我們先配置一個JVM參數
<code>-XX:+TraceClassLoading 監控類的加載
複製代碼/<code>
在IDE配置如下:
demo代碼:
運行結果:
結論:
new ClassLoadInstance實例時,發現ClassLoadInstance被加載了,因此 new創建實例對象,會觸發類加載進行。
訪問類的靜態變量
demo代碼:
運行結果:
結論:
訪問類ClassLoadStaticVariable的靜態變量i時,發現ClassLoadStaticVariable類被加載啦,因此訪問類的靜態變量會觸發類加載。
注意:
訪問final修飾的靜態變量時,不會觸發類加載,因為在編譯期已經將此常量放在常量池了。
訪問類的靜態方法
demo代碼:
運行結果:
結論:
訪問類ClassLoadStaticMethod的靜態方法method時,發現ClassLoadStaticMethod類被加載啦,因此訪問類的靜態方法會觸發類加載。
反射
demo代碼:
運行結果:
結論:
反射得到類ClassLoadStaticReflect時,發現ClassLoadStaticReflect類被加載啦,因此反射會觸發類加載。
當初始化一個類時,發現其父類還未初始化,則先觸發父類的初始化
demo代碼:
運行結果:
看了運行結果,是不是發現,網上那道經典面試題(講講類的實例化順序?)也很清晰啦。 先父類靜態變量/靜態代碼塊-> 再子類靜態變量/靜態代碼塊->父類構造器->子類構造器結論:
實例化子類ClassLoadSub的時候,發現父類ClassLoadSuper先被加載,因此當初始化一個類時,發現其父類還未初始化,則先觸發父類的初始化
虛擬機啟動時,定義了main()方法的那個類先初始化
demo代碼:
運行結果:
結論:
虛擬機啟動時,即使有ClassLoadSub,ClassLoadSuper,ClassLoadTest等類被加載, 但ClassLoadTest最先被加載,即定義了main()方法的那個類會先觸發類加載。
練習與小結
觸發類加載的六大時機,我們都分析完啦,是不是不做個題都覺得意猶未盡呢?接下來,我們來分析類加載一道經典面試題吧。
運行結果:
分析:
- SingleTon.getInstance(),調用靜態方法,觸發SingleTon類加載。
- SingleTon類加載初始化,按順序初始化靜態變量。
- 先執行private static SingleTon singleTon = new SingleTon(); ,調用構造器後,count1,count2均為1;
- 按順序執行 public static int count1; 沒有賦值,所以count1依舊為1;
- 按順序執行 public static int count2 = 0;所以count2變為0.
Java最全面試手冊(性能優化+微服務架構+併發編程+開源框架)
Java面試手冊
一、性能優化面試專欄
1.1、 tomcat性能優化整理
1.2、JVM性能優化整理
1.3、Mysql性能優化整理
二、微服務架構面試專欄
2.1、SpringCloud面試整理
2.2、SpringBoot面試整理
2.3、Dubbo面試整理
三、併發編程高級面試專欄
四、開源框架面試題專欄
4.1、Spring面試整理
4.2、SpringMVC面試整理
4.3、MyBatis面試整理
五、分佈式面試專欄
5.1、分佈式限流面試整理.
5.2、分佈式通訊面試整理
5.3、分佈式數據庫面試整理
正文
一、性能優化專欄
1.1、tomcat性能優化整理
二,微服務架構面試專欄
1、SpringCloud面試整理
1、什麼是Spring Cloud?
Spring cloud流應用程序啟動器是基於Spring Boot的Spring集成應用程序,提供與外部系統的集成。Spring cloud Task,一個生 命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。
資料過多就不給大家一一展示了 獲取這份面試手冊的轉發+關注+私信小編(學習)免費獲取哦!
閱讀更多 JAVA互聯搬磚工人 的文章