Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。

自JDK1.2以来,Java一直保持着三层类加载器、双亲委派的类加载架构。

一.存放位置

1.启动类加载器(Bootstrap Class Loader):

存放在jre\lib 目录下的 rt.jar,启动类加载器无法被Java程序直接引用。

2.扩展类加载器(Extension Class Loader):

存放在 jre\lib\ext 下,这个类加载器是在类sun.misc.Launcher$ExtClassLoader 
中以Java代码的形式实现的

3.应用程序类加载器(Application Class Loader):

这个类加载器由sun.misc.Launcher$AppClassLoader来实现。也称系统类加载器。

二.具体实现:

接下来我们使用代码来展示一下三者的关系

一个类被加载的过程和逆过程是这样的:

程序代码:

public class Car {public static void main(String[] args) {Car car = new Car();Class<? extends Car> aClass = car.getClass();ClassLoader classLoader = aClass.getClassLoader();System.out.println(classLoader);             //应用程序类加载器System.out.println(classLoader.getParent()); //扩展类加载器System.out.println(classLoader.getParent().getParent());  //启动类记载器}
}

结果:

如果返回null,有两种可能:

(1)Java调用不到;

(2)不存在

肯定是存在的,所以是第一种情况,Java调用不到,是因为启动类加载器是用C语言写的,所以Java调用不到。

三.双亲委派模型

上图展示的各类加载器之间的层次关系被称为类加载器的“双亲委派模型”。双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有父类加载器。不过这里的父子关系一般不是继承的关系来实现的,而是通过组合关系来复用夫加载器的代码。

1.双亲委派模型的工作流程:

如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器,每一层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器,只有当夫加载器反馈自己无法完成这个加载请求时,子加载器才会自己去完成加载。

比如说我们知道在启动类加载器下有个java.lang.String类,如果我们同样创建一个java.lang.String类,那么,问题就来了。

就是因为在我们的启动类加载器中有了这个类,所以,首先是启动类加载器进行加载,如果父类加载器无法加载,那么才由子加载器加载。

双亲委派模型是保证安全的。

额外知识点:Java是在C++的基础上去掉了指针和内存管理,Java也叫C++--。

类加载器以及双亲委派模型相关推荐

  1. jvm:类加载器与双亲委派模型

    两个类相等需要类本身相等,并且使用同一个类加载器进行加载.这是因为每一个类加载器都拥有一个独立的类名称空间. 这里的相等,包括类的 Class 对象的 equals() 方法.isAssignable ...

  2. 类加载器、双亲委派模型

    目录 1.简介 2.类和类加载器 3.双亲委派模型 3.1 启动类加载器: 3.2 扩展类加载器 3.3应用程序类加载器 3.4  类加载器的双亲委派模型(Parents Delegation Mod ...

  3. Android插件化开发基础之Java类加载器与双亲委派模型

    类加载器 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程. 在加载阶段,java虚拟机需 ...

  4. 【深入理解JVM】:类加载器与双亲委派模型

    转载自  [深入理解JVM]:类加载器与双亲委派模型 类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段" ...

  5. JVM—类加载器和双亲委派模型

    关注微信公众号:CodingTechWork,一起工作学习总结. 文章目录 引言 类加载器 类与类加载器关系 类加载器分类 启动类加载器 扩展类加载器 应用程序类加载器 双亲委派模型 介绍 工作流程 ...

  6. JVM 类加载器与双亲委派模型

    1. 类加载器 我们知道,虚拟机在加载类的过程中需要使用类加载器进行加载,而在 Java 中,类加载器有很多,那么当 JVM 想要加载一个 .class 文件的时候,到底应该由哪个类加载器加载呢?这时 ...

  7. 类加载器和双亲委派模型

    虚拟机设计团队有意把类加载阶段中的"通过一个类的全限定名来获取描述该类的二进制字节流"这个动作放到java虚拟机外部去实现,以便让应用程序自己决定获取所需的类.实现这个动作的代码被 ...

  8. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  9. JVM初学之类java的类加载器和双亲委派模型

    类加载器: 定义:java类加载器用于对java类的加载,java有自带的类加载器,也可以自定义类加载器实现定制化,类似于tomcat. java自带了三个系统的类加载器:如下图: 双亲委派模型: 背 ...

最新文章

  1. python的类型化_显式类型化的Python版本?
  2. Linux下Nginx编译安装后的开机自启动设置
  3. linux下netty接收不到服务,Netty 发送消息失败或者接收消息失败的可能原因
  4. 如何去maven仓库下载jar包
  5. unity mysql生成cexcel_【C#附源码】数据库文档生成工具支持(Excel+Html)
  6. mysql带账号联查表_MySQL联表查询的简单示例
  7. 图片也要查重了?期刊用AI审论文防造假,旋转/翻转/拉伸都不行
  8. C++工作笔记-对继承的进一步认识
  9. python无缘无故不执行/跳过某个函数,无报错无警告
  10. 就地过年的年轻人都去搜索“年夜饭”外卖了
  11. void及void指针含义的深刻解析
  12. mongodb E11000 duplicate key error collection: index: _id_ dup key
  13. 连接DB2 抛异常SQL Error SQLCODE=-204, SQLSTATE=42704
  14. UINO优锘去ChinaJoy秀数字孪生元宇宙落地应用!
  15. cocos2d-x传智播客_Hanselminutes播客30-Outlook加载项和个人生产力增强器
  16. 飞秋与虚拟机的有关IP设置
  17. web前端页面优化详解
  18. Python模拟鼠标点击与实时获取鼠标位置
  19. 重学scala:scala面向对象编程之类与对象
  20. 独立版微信动态二维码活码管理系统免授权版

热门文章

  1. Rsync、Inotify-tools简介
  2. openStack 手动部署文档
  3. oc总结 --oc基础语法相关知识
  4. POJ 3281 (最大流+匹配+拆点)
  5. 在linux大量进程里只看root的命令
  6. 天河一号超级计算机研制成功,我国首台千万亿次超级计算机“天河一号”研制成功,其运..._简答题试题答案...
  7. 华三刀片服务器如何安装系统,刀片服务器及其操作系统的安装方法及系统专利_专利查询 - 天眼查...
  8. 1.5_insert_sort_插入排序
  9. php5.4连接mysql_PHP5.4+连MySQL数据库
  10. tomcat catalina localhost 没有项目_Tomcat简介--01