关于双亲委派机制和类加载的过程

85 阅读2分钟

关于双亲委派机制和类加载的过程

关于双亲委派机制和类加载的过程我们写的java文件到最终运行,他必须经过编译和类加载两个阶段,而编译阶段的过程就是把
.java文件编译成.class文件,而类加载的阶段就是把.class文件加载到JVM内存里面,加载完毕
会得到一个Class对象,我们可以使用new关键字来实例化这个对象,如下图:

image.png

而类的加载过程需要涉及 到类加载器,JVM在运行的时候会产生三个类加载器,这三个类加载器组成了一个层级关系,每一个加载器分别去加载不同作用范围的jar包,比如说Bootstrap Classloader(启动类加载器) 它主要是负责加载java核心类库的加载也就是lib目录下rt.jar和resources.jar等,Extension ClassLoader(扩展类加载器)主要加载lib\ext目录下的一个jar包和class文件,Application ClassLoader(应用类加载器),主要负责当前应用里面classpath下面的所有jar包和class文件,处理系统自己提供的类加载器以外还可以通过ClassLoader类来实现自定义加载器,去满足一些场景需要。

image.png

而所谓的双亲委派模型,就是按照类加载器的层级关系,逐层进行委派,比如当我们需要加载一个class文件的时候,首先会去把这个class文件的查询和加载委派给父加载器去执行,如果父加载器无法加载,再尝试自己去加载这个class

image.png 我认为这样的好处:

  • 安全性:因为这种层级关系实际上代表的是一种优先级,也就是所有的类加载优先要给到启动类加载器,那么对于核心类库中的一些类就没有办法被破坏,比如自己写一个java.lang.String最终还是要交给启动类加载器,自己写的java.lang.String就没办法去覆盖类库中的类。
  • 我认为这种层级关系的设计,可以避免重复加载导致程序混乱的一些问题,如果父加载器已经加载过了,那么子加载器就没有必要再去加载了

image.png

然而运行结果:

image.png 很显然出错了,这就是双亲委派机制的好处。