对类加载器(ClassLoader)中getParent的理解
源码:
/**
* 返回父类加载器以进行委派。
* 一些实现可能用null来代表引导类加载器。如果此类加载器的父类(这里指的是类加载器中的父子关系,不是继承的父子关系)是引导类加载器,这个方法将在这些实现中将返回null。
* 如果存在安全管理器,并且调用者的类加载器是不为null的,也不是类加载器的根加载器,
* 则此方法将会调用SecurityManager#checkPermission(java.security.Permission)这个方法来验证允许访问父类加载器。反之则抛出异常。
简单的说:此方法返回下图委派模型中的一种类加载器。
在调用此方法时,如果当前调用者类加载器是扩展类加载器,因其父加载器是引导类加载器,则返回null。
*/
private final ClassLoader parent;
@CallerSensitive
public final ClassLoader getParent() {
if (parent == null)
return null;
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
//检查对父类加载器的访问
//如果调用者的类加载器与此类加载器相同,
//执行权限检查。
checkClassLoaderPermission(parent, Reflection.getCallerClass());
}
return parent;
}
双亲委派模型类加载器之间的关系:
思路源自:https://blog.****.net/javazejian/article/details/73413292