一,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,给系统带来极大的隐患。