先说结论
AppClassLoad 调用loadClass(String name), 判断是否有父加载器,
如果有就调用父类的loadClass(String name),父类继续判断是否有爷爷加载器,
如果有就调用爷爷类的loadClass(String name),如果爷爷类没有太爷加载器,就去调用BootStrapClassLoad,使用native方法,加载jre库;如果没有找到返回null;
此时调用子类的fildClass(String name)方法,委托给子类去查找;
其中 fildClass(String name) 方法比较重要,是抽象方法,你如果不实现,向下委派的时候就ClassNotFoundException,你可以实现 去任何地方加载类,去本地,去任意文件夹,去任意网络,只要你想得到;
总结流程如图:
源码如下:已删除 多余代码,简洁处理了
protected Class<?> loadClass(String name, boolean resolve) {
synchronized (getClassLoadingLock(name)) {
// 第一步检查类是否被加载过
Class<?> c = findLoadedClass(name);
// 没有被加载过
if (c == null) {
try {
// 如果存在父加载器,向上委派,使用父加载器加载
if (parent != null) {
c = parent.loadClass(name, false);
} else {
// 没有了父加载器,使用BootstrapClassLoad, c++代码所写
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
}
// 如果都没加载到,
if (c == null) {
// 调用子类的findClass,向下委派,子类主要是重写此方法进行任意加载
c = findClass(name);
}
}
if (resolve) {
resolveClass(c);
}
return c;
}
}
能力有限、不足之处望评论指正