双亲委派机制详解

发布于:2022-11-04 ⋅ 阅读:(689) ⋅ 点赞:(0)

Java源文件到最终运行出效果需要经过两个阶段,分别为编译阶段类加载阶段

编译的过程实际上就是把我们的 .java文件编译成class文件的过程。而类加载过程则是将class文件装载到JVM的内存中,装载完成后就可以得到一个Class对象,此时我们就可以通过new关键字来实例化该对象。在类的加载过程中,就需要涉及到我们的类加载器。

JVM在运行的时候,会产生3个类加载器,每个类加载器分别加载不同作用的一些jar包,Bootstrap Class Loader(启动类加载器)主要负责Java核心类库的加载;Extension Class Loader(扩展类加载器)主要负责ext目录下的jar包和class文件;Application Class Loader(应用类加载器)主要负责当前应用中的classpath下的所有的jar包和class文件。

 

双亲委派,就是按照类加载器的层级关系,逐层进行委派。

当我们需要加载一个class文件的时候,首先会把这个class的查询和加载委派给到父加载器去执行,如果父类加载器无法加载(全部父类),最后再尝试自己来加载这个class。

例如:现在我们要使用Application Class Loader加载一个test.class,我们的加载器并不会立即进行这个class文件的加载,而是先委托给其父加载器Extension Class Loader,同样的 Extension Class Loader也不会立即加载而是选择继续委托给父类加载器,也就是Bootstrap Class Loader。此时如果Bootstrap Class Loader加载失败,则返回给Extension Class Loader尝试加载,如果同样加载失败就继续返回给Application Class Loader去尝试加载。

这样设计的好处:

        首先就是安全性,因为这种层级关系实际上代表的是一种优先级,也就是所有的类的加载,优先给Bootstrap Class Loader。那对于核心类库中的类,就没办法去破坏。其次,这种层级关系的设计,可以避免重复加载的问题,因为此时如果父加载器已经加载过了,那么子类就没有去加载的必要了。


网站公告

今日签到

点亮在社区的每一天
去签到