java基础 -- 类装载器 £神魔★判官ぃ 2024-04-18 17:20 22阅读 0赞 ## 类装载器 ClassLoader ## **工作机制** 定义:类装载器就是寻找类的字节码文件并构造出类,在 JVM 内部表现出来为对象的组件 。在 Java 中,类装载器把一个类装入 JVM 中,要经过以下步骤; 1. 装载:查找和导入 Class 文件; 2. 链接:执行校验、准备和解析步骤,其中解析步骤是可以选择的: * 校验:检查载入 Class 文件数据的正确性; * 准备:给类的静态变量分配存储空间; * 解析:将符号引用转成直接引用; 3. 初始化:对类的静态变量、静态代码块执行初始化工作。 类装载工作由 ClassLoader 及其子类负责,ClassLoader 是一个重要的 Java 运行时系统组件,它负责在运行时查找和装入 Class 字节码文件。JVM 在运行时会产生三个 ClassLoader:根装载器、ExtClassLoader(扩展类装载器)和 AppClassLoader(系统类装载 器)。 其中,根装载器不是 ClassLoader 的子类,它使用 C++编写,因此我们在 Java 中看不到它, ExtClassLoader 和 AppClassLoader 都是 ClassLoader 的子类。 * 根装载器负责装载 JRE 的核心类库,如 JRE 目标下的 rt.jar、charsets.jar 等。 * ExtClassLoader 负责装载JRE 扩展目录 ext 中的 JAR 类包; * AppClassLoader 负责装载 Classpath 路径下的类包。 这三个类装载器之间存在父子层级关系,即根装载器是 ExtClassLoader 的父装载器, ExtClassLoader 是 AppClassLoader 的父装载器。默认情况下,使用 AppClassLoader 装载应 用程序的类,我们可以做一个实验 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70] 控制台打印如下 ![在这里插入图片描述][20190910095432966.png] 根装载器在Java中访问不到,所以返回null 通过以上的输出信息,我们知道当前的 ClassLoader 是 AppClassLoader,父 ClassLoader是 ExtClassLoader,祖父 ClassLoader 是根类装载器,因为在 Java 中无法获得它的句柄,所以仅返回 null JVM 装载类时使用“全盘负责委托机制”, “全盘负责”是指当一个 ClassLoader 装载一个类的时,除非显式地使用另一个 ClassLoader,该类所依赖及引用的类也由这个ClassLoader 载入; “委托机制”是指先委托父装载器寻找目标类,只有在找不到的情况下才从自己的类路径中查找并装载目标类。这一点是从安全角度考虑的,试想如果有人编写 了一个恶意的基础类(如 java.lang.String)并装载到 JVM 中将会引起多么可怕的后果。但 是由于有了“全盘负责委托机制”,java.lang.String 永远是由根装载器来装载的,这样就避 免了上述事件的发生。 **ClassLoader 重要方法** ClassLoader 是一个抽象类,位于 java.lang 包中。下面对该类的一些重要 接口方法进行介绍 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 2] * **loadClass(String name)** name 参数指定类装载器需要装载类的名字,必须使用全限定类名,如 com.baobaotao. beans.Car。该方法有一个重载方法 loadClass(String name ,boolean resolve),resolve 参数告 诉类装载器是否需要解析该类。在初始化类之前,应考虑进行类解析的工作,但并不是所 有的类都需要解析,如果 JVM 只需要知道该类是否存在或找出该类的超类,那么就不需 要进行解析。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 3] **- defineClass(String name, byte\[\] b, int off, int len)** 将类文件的字节数组转换成 JVM 内部的 java.lang.Class 对象。字节数组可以从本地文 件系统、远程网络获取。name 为字节数组对应的全限定类名 **- findSystemClass(String name)** 从本地文件系统载入 Class 文件,如果本地文件系统不存在该 Class 文件,将抛出 ClassNotFoundException 异常。该方法是 JVM 默认使用的装载机制 **- findLoadedClass(String name)** 调用该方法来查看 ClassLoader 是否已装入某个类。如果已装入,那么返回 java.lang.Class 对象,否则返回 null。如果强行装载已存在的类,将会抛出链接错误 **- getParent()** 获取类装载器的父装载器,除根装载器外,所有的类装载器都有且仅有一个父装载器, ExtClassLoader 的父装载器是根装载器,因为根装载器非 Java 编写,所以无法获得,将返 回 null 每一个类在 JVM 中都拥有一个对应的 java.lang.Class 对象,它提供了类结构信息的描 述。数组、枚举、注解以及基本 Java 类型(如 int、double 等),甚至 void 都拥有对应的 Class 对象。Class 没有 public 的构造方法。Class 对象是在装载类时由 JVM 通过调用类装 载器中的 defineClass() 方法自动构造的 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 4] 类实例,类描述对象及类装载器关系 总结,类装载器装载类,调用defineClass()把进制文件转为long类型class文件在虚拟机里面。 三个装载器,分别是扩展类装载器,根装载器,以及系统装载器。 可以通过getParent()查看父类,findLoadedClass查看是否被装载。虚拟机在加载类装载器装载会进行判断,检验跟解析。loadClass放入全限定名称加载 java依托于虚拟机,生成class文件,通过虚拟机的类加载器加载把二进制文件加载为java文件,并且有全盘全盘负责委托机制,除非找不到才会从自己的类路径中查找。增加了安全性。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/3c41eb86537640f6af11832c48035b1a.png [20190910095432966.png]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/22a87f0ff5e3491d9bb17f64fc661be0.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 1]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/011fa45109c34d01bd730b4f7cc75486.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 2]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/cec3a1b5d0d14de2bc02a5aa865ca8c0.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 3]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/b140e4649606432b9fecf2b689e89beb.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDU1MDQ5MA_size_16_color_FFFFFF_t_70 4]: https://image.dandelioncloud.cn/pgy_files/images/2024/04/18/ee760cac92b943ebb2cc0b530bc9acb1.png
还没有评论,来说两句吧...