一,Definition of “Parents classloader Dispacher Model”
- 如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成。
2.每一個層次的類加載器都是如此。因此,所有的加載請求最終都應該傳送到頂層的啓動類加載器中。
3.只有當父加載器反饋自己無法完成這個加載請求時(搜索範圍中沒有找到所需的類),子加載器纔會嘗試自己去加載。
從以下代碼分析,某個類沒有 parents classloader 加載時,纔有可能會讓自定義的classloader 進行加載;因此,“對於任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在虛擬機中的唯一性”,這句話也就不然理解了。
public abstract class ClassLoader {
//....部分元數據未Copy過來:parent ,getClassLoadingLock,
public Class<?> loadClass(String name) throws ClassNotFoundException {
return loadClass(name, false);
}
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
if (c == null) {
c = findClass(name); // do some stats
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
protected Class<?> findClass(String name) throws ClassNotFoundException {
throw new ClassNotFoundException(name);
}
//...
}
二,常見類加載器,或類加載器framework
三,the function of “parents classloader dispatche model”
如果沒有它,則在JVM中通過字節碼操作可以實現加載兩個java.lang.Object,給系統帶來極大的隱患。