2. 双亲委派机制

2.1 双亲委派机制工作原理

2.1.1 原理
  1. Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存,生成class对象。
  1. 加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。

2.1.2 举例说明
  1. 自定义一个java.lang.String,然后在另外的类中调用String类,会发现只打印了"hello",没有打印"我是自定义加载类",也就是说,Java其实没有调用我们自定义的String类

| 这就是因为双亲委派机制,最上层的引导类加载器发现自己可以完成加载任务[BootStrap引导类加载器只加载包名为java、javax、sun等开头的类],所以就去加载了核心类库中的String类,没有加载用户自定义的String类。

| 而且核心类库中的String并没有main方法,在自定义的String类中运行main方法,加载的类是核心类库的String类,就会报找不到main方法的错误

  1. 假设项目中用到SPI接口,SPI属于核心API,需要使用引导类加载器,引导类加载器加载rt.jar,就加载了SPI核心类,之后用到了SPI接口,属于第三方jar包,不属于核心jar,需要用系统类加载器加载,所以就要反向委派,引导类加载器委派线程上下文加载器去加载SPI接口实现,就是说核心API用引导类加载器加载,第三方API用系统类加载器加载    

2.2 双亲委派机制的优势

  1. 避免类的重复加载(一个类只会被一个类加载器加载,而且一定会被加载)。
  1. 保护程序安全,防止核心API被随意篡改

| 假设我们现在要在java.lang包下定义一个类MyString,类加载的时候,引导类加载器发现这个类归它加载,但是java.lang包需要访问权限,所以就会报错

2.3 沙箱安全机制

自定义String类,但是在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载过程中会先加载jdk自带的文件(rt.jar包中的java\lang\String.class),报错信息说没有main方法就是因为加载的是rt.jar包中的String类。这样可以保证对java核心源代码的保护,这就是沙箱安全机制。

最新文章

  1. C#基础---Attribute(标签) 和 reflect(反射) 应用二
  2. 生成树形结构的json字符串代码(c#)供前端angular tree使用.
  3. 160908、前端开发框架Semantic UI
  4. POJ 1658
  5. poj 1159 Palindrome(dp)
  6. POJ-1981 Circle and Points 单位圆覆盖
  7. Zookeeper 在Hadoop中的应用
  8. MVC 5 + EF6 完整教程16 -- 控制器详解
  9. Luogu1613 跑路
  10. Linux用户登录日志查询
  11. AngularJS 截取字符串
  12. Dapper 介绍
  13. SQL Server 2012/2016/2017 新增函数
  14. ubuntu上安装ftp
  15. 网络编程之Socket详解
  16. Day Six
  17. block 的细节和本质
  18. Bootstrap迁移系列 - Modal
  19. springMVC+freemarker实现自定义标签
  20. win7环境下一次浅谈栈溢出

热门文章

  1. CentOS安装部署Mysql 5.7
  2. springboot整合Mybatis(有xml)
  3. ZWave 数据包格式
  4. ca13a_c++_顺序容器的操作6删除元素
  5. Linux MySQL分库分表之Mycat
  6. SpringBoot中注入ApplicationContext对象的三种方式
  7. spring Gateway 和注册中心整合环境搭建1
  8. django python mange.py runserver 源码
  9. ceph luminous版本的安装部署
  10. IDEA版本彩虹屁插件idea-rainbow-fart,一个在你编程时疯狂称赞你的 IDEA扩展插件