java文件要運行放前,除了需要編程成字節(jié)碼文件class文件
還要有類加載器去加載class文件葡公。
判斷兩個類是否一樣袜啃?
在同一個虛擬機的前提下
- 兩個類包名是否一樣(類名稱空間)彼水。
- 加載這兩個類的類加載器是否一樣崔拥。
類加載分為兩種:
- 一種是啟動類加載器(Bootstrap ClassLoader),這個類加載器是使用C++語言實現(xiàn)的凤覆,是虛擬機自身的一部分链瓦。
- 另一種是是其他所有的類加載器。這部分是java語言實現(xiàn)的叛赚,獨立與虛擬機之外的。
所為開發(fā)者的角度稽揭,其加載器可以細(xì)分為:
- 啟動類加載器 bootstrap
加載jdk的lib目錄下的所有類 - 拓展類加載器 extention
加載jdk目錄下ext文件夾下的所有類 - 應(yīng)用程序類加載器 application
這個是程序默認(rèn)的類加載器俺附,加載jvm啟動時,ClassPath上指定的所有類溪掀。 - 自定義類加載器
這個是開發(fā)者自己實現(xiàn)的類加載器
類在加載過程按照雙親委派模型事镣,這并不是嚴(yán)格要求約束的。是默認(rèn)的實現(xiàn)方式揪胃,這種方式帶來的好處璃哟,就是不會導(dǎo)致類加載的混亂。
雙親委派模型的加載過程如下:
如果一個類加載器收到類加載的請求喊递,它首先不會自己去嘗試加載這個類随闪,而是把這個請求委派給父類加載器完成。每個類加載器都是如此骚勘,只有當(dāng)父加載器在自己的搜索范圍內(nèi)找不到指定的類時(即ClassNotFoundException)铐伴,子加載器才會嘗試自己去加載。
默認(rèn)的類加載器是Application ClassLoader俏讹,會首先看父類加載器是否已經(jīng)加載了該類当宴,當(dāng)BootStrap ClassLoader也加載不了時,就是自己去加載泽疆。
如何實現(xiàn)自定義類加載器户矢。
ClassLoader類默認(rèn)的loadClass方法已經(jīng)幫我們寫好了,我們無需去寫殉疼√堇耍看下源碼loadClass方法已經(jīng)實現(xiàn)了雙親委派模型捌年。
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 1.首先,檢查這個類是否已經(jīng)被加載
Class<?> c = findLoadedClass(name);
if (c == null) {
long t0 = System.nanoTime();
try {
// 2.沒有被加載驱证,就先委派給父類加載器去加載
// 父加載器為空的話延窜,找到頂層的bootStrap類加載器
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// 3.如果父類加載器依然沒法加載類,調(diào)起findClass方法抹锄,去自己加載
long t1 = System.nanoTime();
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
在細(xì)看下雙親委派類加載的過程逆瑞,看在哪里器實現(xiàn)自定義類加載器。
- 首先伙单,檢查一下指定名稱的類是否已經(jīng)加載過获高,如果加載過了,就不需要再加載吻育,直接返回念秧。
- 如果此類沒有加載過,那么布疼,再判斷一下是否有父加載器摊趾;如果有父加載器,則由父加載器加載(即調(diào)用parent.loadClass(name, false);).或者是調(diào)用bootstrap類加載器來加載游两。
- 如果父加載器及bootstrap類加載器都沒有找到指定的類砾层,那么調(diào)用當(dāng)前類加載器的findClass方法來完成類加載。
所以要實現(xiàn)自定義類加載器贱案,就是要復(fù)寫findClass方法肛炮,在findClass方法里,去用自定義的類加載器加載宝踪。
mark等到需要使用時侨糟,補充,細(xì)了解瘩燥。
參考:《深入理解java虛擬機》周志明
博文:http://www.importnew.com/24036.html