关于类加载器的双亲委托机制

什么是双亲委派机制:

我们应用程序都是由引导类加载器、扩展类加载器、应用类加载器三种类加载器互相配合进行加载的,还可以加入自己定义的类加载器。称为 类加载器的双亲委派模型 ,这里类加载器之间的父子关系一般不会以继承的关系来实现,而是都使用 组合关系 来复用父加载器的。

双亲委托模型的重要用途是为了解决类载入过程中的安全性问题。
BootstrapClassLoader(引导类加载器)并没有遵守ClassLoader的加载规则。(因为引导类加载器 是由C++编写的,用本地代码实现)

工作原理:
是当一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载都是如此,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法加载这个加载请求的时候,子加载器才会尝试自己去加载。
在这里插入图片描述
过程:

  • 一个class文件发送请求加载,会先找到自定义的类加载器,当然这里没画出来
  • APPClassLoader得到加载器请求后,向上委托交给ExtClassLoader,ExtClassLoader同理会交给BoostrapClassLoader,这是向上委托方向
  • 最终到达BoostrapClassLoader,会先在缓存中找,没有就尝试在自己能加载的路径去加载,找不到就交给ExtClassLoader,同理一直到用户自定义的ClassLoader,这就是向下查找方向
  • 前面说的类的唯一性由类和类加载器共同决定, 这样保证了确保了类的唯一性

使用双亲委托机制的好处:

第一:可以避免重复加载,当父亲已经加载了该类的时候,子类不需要再次加载。

第二:考虑到安全因素,如果不使用这种委托模式,那我们就可以随时使用自定义的String来动态替代java核心api中定义类型,这样会存在非常大的安全隐患,而双亲委托的方式,就可以避免这种情况,因为String已经在启动时被加载,所以用户自定义类是无法加载一个自定义的类加载器。

发布了26 篇原创文章 · 获赞 10 · 访问量 6500

猜你喜欢

转载自blog.csdn.net/qq_40806970/article/details/100184817