关于类加载的双亲委派模型,我们可以这样来详细讲解:
一、什么是类加载的双亲委派模型?
类加载器在加载类的过程中,会先将请求交给父类加载器去完成类加载。如果父类加载器无法完成类加载,才由自己来实现类的加载。这种按照一定顺序依次向上委托的模型,就是类加载的双亲委派模型。
在这个模型中,类加载器之间是存在父子关系的。一个类加载器在加载某个类的时候,如果它的父类加载器能够完成类加载的任务,那么就将该任务委托给父类加载器去完成。如果父类加载器依然无法完成该加载任务,那么才由该子类加载器自己去完成类的加载。
二、双亲委派模型的作用
通过这种双亲委派模型,在保证类的安全性和防止类的重复加载、提高加载效率等方面都起到了重要的作用。双亲委派模型中的各个类加载器都具有良好的隔离性,这样能够有效地保证每一个类都只被加载一次,避免出现重复的类和类的冲突。
三、使用示例
示例一:
假设有以下代码:
String str = new String("Hello");
在执行这段代码的时候,JVM首先会从当前线程的ClassLoader的父亲ClassLoader开始查找是否已经加载过 String类。
如果父Loader已经加载,那么直接返回父Loader加载过的String类的Class对象;如果没有找到,则再从父Loader的父Loader开始查找,依次往上查找下去,直到找到顶层的BootStrap ClassLoader为止。在这个过程中,如果中途某一个Loader成功加载过String类,那么JVM就直接返回获取到的Class对象了,不再加载。
如果到了最顶层的BootStrap ClassLoader,仍然没有找到已经加载过的String类的Class对象,那么才会由当前的ClassLoader来尝试加载该类。这就是双亲委托模型的执行过程。
示例二:
假设现在有两个自定义的ClassLoader:MyClassLoader和MyChildClassLoader。其中,MyClassLoader是MyChildClassLoader的父类加载器。
在执行 MyChildClassLoader.loadClass("com.example.MyClass")
的时候,它的执行过程如下:
- MyChildClassLoader收到loadClass请求后,会先查看自己是否已经加载过该类。
- 如果MyChildClassLoader已经加载过,那么直接返回该类的Class对象,加载过程结束。
- 如果MyChildClassLoader没有加载过MyClass类,那么MyChildClassLoader会委托它的父类加载器MyClassLoader去尝试加载MyClass类。
- 如果MyClassLoader已经加载过该类,那么直接返回该类的Class对象。
- 如果MyClassLoader没有加载过MyClass类,那么MyClassLoader会再委托它的父类加载器去尝试加载MyClass类,依次向上委托。
- 如果最终都没有加载成功,则MyChildClassLoader会自己尝试加载MyClass类。
通过这个示例,我们可以看出,双亲委派模型中,每个类加载器都拥有一个父类加载器,并按照严格的层级关系依次进行类的加载,当最底层的类加载器无法完成类的加载任务时,才由自己来尝试进行类的加载,这就保证了类的安全性和重复加载问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:什么是类加载的双亲委派模型? - Python技术站