双亲委派模型是怎样实现的
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
synchronized (getClassLoadingLock(name)) {
// 若本加载器之前是否已加载过,直接取缓存,native方法实现
Class c = findLoadedClass(name);
if (c == null) {
try {
// 只要有父加载器就先委派父加载器来加载
if (parent != null) {
// 注意此处递归调用
c = parent.loadClass(name, false);
} else {
// ext的parent为null,因为Bootstrap是无法被程序被访问的,
//默认parent为null时其父加载器就是Bootstrap
// 此时直接用native方法调用启动类加载加载,若找不到则抛异常
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// 对ClassNotFoundException不做处理,仅用作退出递归
}
if (c == null) {
// 如果父加载器无法加载那么就在本类加载器的范围内进行查找
// findClass找到
//class文件后将调用defineClass方法把字节码导入方法区,同时缓存结果
c = findClass(name);
}
}
// 是否解析,默认false
if (resolve) {
resolveClass(c);
}
return c;
}
}