Java13的双亲委派模型:
jvm中的ClassLoader通常采用双亲委派模型,要求除了启动类加载器以外,其余的类加载器都应该有自己的父级类加载器。这里的父子关系是组合而不是继承,工作过程如下:
1.一个类的加载器收到类的加载请求以后,首先搜索他的内建加载器定义的所有“具名模块”
2.如果找到了合适的模块定义,将会使用该加载器来加载
3.如果class没有在这些加载器定义的具名模块中找到,那么将会委托给父类加载器,直到启动类加载器。
4.如果父级加载器反馈它不能完成加载请求,比如在他的搜索路径下找不到这个类,那子的类加载器才来自己加载
5.在类路径下找不到的类将成为这些加载器的无名模块
Java8 的双亲委派模型:
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时,子加载器才会尝试自己去完成加载。
双亲委派模型的机制和作用:
1、防止重复加载同一个.class
。通过委托去向上面问一问,加载过了,就不用再加载一遍。保证数据安全。
2、保证核心.class
不能被篡改。通过委托方式,不会去篡改核心.clas
,即使篡改也不会去加载,即使加载也不会是同一个.class
对象了。不同的加载器加载同一个.class
也不是同一个Class
对象。这样保证了Class
执行安全。
破坏双亲委派模型:
参考博客: