关于类加载器的双亲委托机制
作者:互联网
什么是双亲委派机制:
我们应用程序都是由引导类加载器、扩展类加载器、应用类加载器三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。
双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。
BootstrapClassLoader(引导类加载器)并没有遵守ClassLoader的加载规则。(因为引导类加载器 是由C++编写的,用本地代码实现)
工作原理:
是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。
过程:
- 一个class文件发送请求加载,会先找到自定义的类加载器,当然这里没画出来
- APPClassLoader得到加载器请求后,向上委托交给ExtClassLoader,ExtClassLoader同理会交给BoostrapClassLoader,这是向上委托方向
- 最终到达BoostrapClassLoader,会先在缓存中找,没有就尝试在自己能加载的路径去加载,找不到就交给ExtClassLoader,同理一直到用户自定义的ClassLoader,这就是向下查找方向
- 前面说的类的唯一性由类和类加载器共同决定, 这样保证了确保了类的唯一性
使用双亲委托机制的好处:
第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。
第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类加载器。
标签:请求,自定义,ExtClassLoader,委托,双亲,加载 来源: https://blog.csdn.net/qq_40806970/article/details/100184817