码迷,mamicode.com
首页 > 其他好文 > 详细

双亲委派机制

时间:2020-07-17 22:01:41      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:加载   递归   cep   异常   扩展   info   标准   继承   rap   

1.1定义

JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。

1.2流程

技术图片
如图所示,当jvm要加载.class的时候:
1.首先会到自定义加载器(CustomClassLoader)中查找(其实是看运行时数据区的方法区有没有加载),看是否已经加载过,如果已经加载过,则返回字节码。
2.如果自定义加载器(CustomClassLoader)没有加载过,则询问系统类加载器(即AppClassLoader)是否已经加载过.class。如果已经加载过,则返回字节码。
3.如果AppClassLoader没有加载过,则询问标准扩展类加载器(ExtClassLoader)是否已经加载过。如果已经加载过,则返回字节码。
4.如果ExtClassLoader没有加载过,则启动类加载器(BoopStrapClassLoader)是否已经加载过。如果已经加载过,则返回字节码。
5.如果BoopStrapClassLoader依然没有加载过,首先通过BoopStrapClassLoader尝试加载,如果加载成功就返回字节码文件。
6.如果BoopStrapClassLoader加载失败,就尝试ExtClassLoader加载,如果加载成功就返回字节码文件。
7.如果ExtClassLoader加载失败,就尝试AppClassLoader加载,如果加载成功就返回字节码文件。
8.如果AppClassLoader加载失败,就尝试CustomClassLoader加载,如果加载成功就返回字节码文件。
9.如果CustomClassLoader加载失败,就抛出异常ClassNotFoundException。

1.3注意点:

1.开发者无法直接获取到启动类加载器的引用,加载器本质也是一个java类,所以最初始的启动类加载器肯定不是java写的,而是用c++写的。
2.虽说bootStrap、extclassLoader、appclassloader三个是父子类加载器关系,但是并没有使用继承,而是使用了组合关系。

1.4双亲委派机制的作用:

1.保证一个.Class只加载一次。
2.保证java核心代码不会被篡改。

双亲委派机制

标签:加载   递归   cep   异常   扩展   info   标准   继承   rap   

原文地址:https://www.cnblogs.com/jiezao/p/13332740.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!