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