Java 类加载总结
一、類加載過程
- 裝載
- 鏈接
- 驗證
- 準備
- 解析
- 初始化
?
二、類初始化情況
1)創建類的實例,也就是new一個對象 ?
2)訪問某個類或接口的靜態變量,或者對該靜態變量賦值 ?
3)調用類的靜態方法 ?
4)反射(Class.forName("xx")) ?
5)初始化一個類的子類(會首先初始化子類的父類) ?
6)JVM啟動時標明的啟動類,即文件名和類名相同的那個類
?
三、類加載器
1)BootstrapClassLoader
加載$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++實現,不是ClassLoader子類
2)ExtensionClassLoader
加載java平臺中擴展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目錄下的jar包
3)AppClassLoader
加載classpath中指定的jar包及目錄中class
4)CustomClassLoader
屬于應用程序根據自身需要自定義的ClassLoader,如tomcat、jboss都會根據j2ee規范自行實現ClassLoader
加載過程中會先檢查類是否被已加載,檢查順序是自底向上,從CustomClassLoader到BootStrapClassLoader逐層檢查,只要某個classloader已加載就視為已加載此類,保證此類只所有ClassLoader加載一次。而加載的順序是自頂向下,也就是由上層來逐層嘗試加載此類。
?
四、雙親委派加載模型
某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。
注意,雙親委派模型是Java設計者推薦給開發者的類加載器的實現方式,并不是強制規定的。大多數的類加載器都遵循這個模型,但是JDK中也有較大規模破壞雙親模型的情況,例如線程上下文類加載器(Thread Context ClassLoader)的出現。
(1)線程上下文類加載器,這個類加載器可以通過java.lang.Thread類的setContextClassLoader()方法進行設置,如果創建線程時還未設置,它將會從父線程中繼承一個,如果在應用程序的全局范圍內都沒有設置過的話,那么這個類加載器就是應用程序類加載器。JDBC就是采用了這種方式。?
(2)Tomcat的類加載機制不能算完全“正統”的雙親委派,WebappClassLoader內部重寫了loadClass和findClass方法,實現了繞過“雙親委派”直接加載web應用內部的資源,當然可以通過在Context.xml文件中加上<Loader delegate = "true">開啟正統的“雙親委派”加載機制。
總結
以上是生活随笔為你收集整理的Java 类加载总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查看华硕笔记本显卡是否是独立显卡?
- 下一篇: Java 反射总结