双亲委派机制

224 阅读2分钟

双亲委派机制

Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,即把请求交由父类处理,它是一种任务委派模式。

例如我们项目中有一个java.lang包,这个包下有一个String类,这配置和原生String一模一样,但如果我们在测试类中使用该类的话:

String str = new String();

这样获取到的却是java中自带的String类,而不是我们自定义的类,虽然我们在真正的项目中并不会写成这样,但这个问题却能引出我们今天要讨论的主题:双亲委派机制

其实这是一个java中的保护机制,为防止外来包中存在恶意攻击程序而采取的措施

工作原理

如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行

如果其父类加载器还存在父类加载器,则进一步向上委托,依此递归,请求最终到达顶层的启动类加载器

如果父类加载器可以完成类加载,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载,这就是双亲委派模式。

ClassLoaderExtends.png

那么我们上方的例子就有了解释:

一开始我们想加载我们自己的String类,如果要加载,则会交由Application ClassLoader进行加载,但它还有父加载器,那就是Extension ClassLoader,Extension ClassLoader还有父加载器,那就是Bootstrap ClassLoader,层层递进,最终交由最高级加载器去加载

回顾一下:Bootstrap ClassLoader——启动类加载器只负责加载包名为java、javax、sun等开头的类,于是就有了下方的场景👇

Bootstrap ClassLoader一看到加载请求,java.lang.String?这我熟啊!二话不说,直接给你加载,但加载的却是java中真正的lang包下的String类,而不是我们自己创建的冒牌货。

如此,就保证了原生API不会被自定义类篡改,保证了安全。

总结优势

  • 避免类的重复加载
  • 保护程序安全,防止API被随意篡改