今天在看jvm的时候,将class文件加载到内存的过程,被这个“双亲委派”搞晕了。缕了一下午,终于有所收获,记录一下:
梳理清晰之后,正确的理解应该是:
首先,一个类在刚开始被类加载器加载的时候,类加载器判断是否加载过此类,
这个时候肯定是没有加载的。
此时类加载器不会加载该类,
而是按照:自定义加载器1 -> 应用程序类加载器->扩展类加载器->启动类加载器 的顺序一层层的向上抛。
一直抛到BootstrapClassLoader。
BootstrapClassLoader表示也没有加载过此类,并且也处理不了。这个时候再一层层的向下抛,
一直抛到能处理这个类的加载器。此时才加载此类。
该类再次被加载的时候(破坏双亲委派,例如自己写一个java.lang.String),因为之前这个类已经被爸爸们加载过了,所以我们自己写的这个类根本没有机会得到加载。
这也是为什么要使用双亲委派?为了安全
