類與類加載器
對于任何一個類,都需要有加載它的類加載器和這個類本身一通確立其在java虛擬機中的唯一性。每一個類加載器,都需要有一個獨立的類名稱空間。
更通俗一點的意思是:如果需要比較兩個類是否相等
,只有當這兩個類都是同一個類加載器加載的前提下,才能進行比較,否則如果加載這兩個類的加載器完全不同,則這兩個類必定是不一樣的。
package com.deem.classload.test;
import java.io.InputStream;
public class ClassLoadTest {
public static void main(String[] args) throws Exception {
ClassLoader myClassLoad = new ClassLoader() {
@Override
public Class<?> loadClass(String name) throws ClassNotFoundException {
try {
String className = name.substring(name.lastIndexOf(".") + 1) + ".class";
InputStream is = getClass().getResourceAsStream(className);
if (is == null) {
return super.loadClass(name);
}
byte[] b = new byte[is.available()];
is.read(b);
return defineClass(name, b, 0, b.length);
} catch (Exception e) {
throw new ClassNotFoundException(name);
}
}
};
Object obj = myClassLoad.loadClass("com.deem.classload.test.ClassLoadTest").newInstance();
System.out.println(obj.getClass());
System.out.println(obj instanceof com.deem.classload.test.ClassLoadTest );
}
}
運行結果為
class com.deem.classload.test.ClassLoadTest
false
從第一個輸出結果來看,這個對象確實是類com.deem.classload.test.ClassLoadTest實例化出來的對象
第二句 最比較時,返回 false,這個對象時通過我們自定義的類加載器進行加載的,其實此時虛擬機中存在了兩個ClassLoadTest類,一個是系統應用程序自己加載的,另一個則是我們自己定義的類加載器進行加載的,雖然都是同一個Class文件,但是依然是兩個獨立的類,故而結果是false
類加載器與雙親委派機制
JVM預定義的三種類型類加載器:
- 啟動(Bootstrap)類加載器:是用本地代碼實現的類裝入器,它負責將 <Java_Runtime_Home>/lib下面的類庫加載到內存中(比如rt.jar)。由于引導類加載器涉及到虛擬機本地實現細節,開發者無法直接獲取到啟動類加載器的引用,所以不允許直接通過引用進行操作。
- 標準擴展(Extension)類加載器:是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)實現的。它負責將< Java_Runtime_Home >/lib/ext或者由系統變量 java.ext.dir指定位置中的類庫加載到內存中。開發者可以直接使用標準擴展類加載器。
- 系統(System)類加載器:是由 Sun 的
AppClassLoader(sun.misc.Launcher$AppClassLoader)實現的。它負責將系統類路徑(CLASSPATH)中指定的類庫加載到內存中。開發者可以直接使用系統類加載器。
除了以上列舉的三種類加載器,還有一種比較特殊的類型 — 線程上下文類加載器。
雙親委派機制描述
image.png
image.png
某個特定的類加載器在接到加載類的請求時,首先將加載任務委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功返回;只有父類加載器無法完成此加載任務時,才自己去加載。
參考
- 周志明,深入理解Java虛擬機:JVM高級特性與最佳實踐,機械工業出版社
- Alexia(minmin)博客,http://www.cnblogs.com/lanxuezaipiao/p/4138511.html
- 笨鳥快飛的博客,http://blog.csdn.net/u011080472/article/details/51332866