类加载器 java委托机制_java类加载器的父亲委托机制详细介绍

讲解一下ClassLoader这个类

java.lang.Object

49667201java.lang.ClassLoader

类加载器是负责加载类的对象。ClassLoader 类是一个抽象类。如果给定类的二进制名称,那么类加载器会试图查找或生成构成类定义的数据。一般策略是将名称转换为某个文件名,然后从文件系统读取该名称的“类文件”。

ClassLoader 类使用委托模型来搜索类和资源。每个 ClassLoader 实例都有一个相关的父类加载器。需要查找类或资源时,ClassLoader 实例会在试图亲自查找类或资源之前,将搜索类或资源的任务委托给其父类加载器。虚拟机的内置类加载器(称为 "bootstrap class loader")本身没有父类加载器,但是可以将它用作 ClassLoader 实例的父类加载器。

ClassLoader 有二个构造方法:

//这个构造方法 返回

protected ClassLoader()

使用方法 getSystemClassLoader() 返回的 ClassLoader 创建一个新的类加载器,将该加载器作为父类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

//这个带参数的构造方法,可以指定当前类的父加载器

protected ClassLoader(ClassLoader parent)

使用指定的、用于委托操作的父类加载器创建新的类加载器。

如果存在安全管理器,则调用其 checkCreateClassLoader 方法。这可能导致安全性异常。

参数:

parent - 父类加载器

public Class> loadClass(String name)

throws ClassNotFoundException

使用指定的二进制名称来加载类。此方法使用与 loadClass(String, boolean) 方法相同的方式搜索类。Java 虚拟机调用它来分析类引用。调用此方法等效于调用 loadClass(name, false)。

参数:

name - 类的二进制名称

返回:

得到的 Class 对象

protected Class> findClass(String name)

throws ClassNotFoundException

使用指定的二进制名称查找类。此方法应该被类加载器的实现重写,该实现按照委托模型来加载类。在通过父类加载器检查所请求的类后,此方法将被 loadClass 方法调用。默认实现抛出一个ClassNotFoundException。

参数:

name - 类的二进制名称

返回:

得到的 Class 对象

Java中的类加载器主要是父亲委托机制,其中的父亲委托机制并不是继承,而是聚集。下一篇文档会解析一下ClassLoader的源码

在父亲委托机制中,各个加载器按照父子关系形成了树的结构,除了跟类加载器以为,其余的类加载器有且只有一个父加载器。

下图是一个类加载器的树形图结构,表示父亲委托机制之间的关系:

5606f3f61a1ba6915d6d226528e15641.png

以下是一个根据上图的一个类加载过程的实例讲解:

0472e24b7e3eab808477ed280659a9f7.png

以下图片介绍定义类加载器和初始类加载器:

b267cfecc7cfa411f6932b055c7925a1.png

bcaef549e65f7df3fd3d11a875a7fe88.png

类加载之间的真正的关系:

c08a7dd21bfdf2558b42ffe1203d26da.png

716a485335c0ba33c3e08266ba0c7db1.png

为什么要使用父亲委托机制???

5511000834c753b5c829f1d5b84d494a.png

命名空间:

94ab98b9670e40a3a395df87facc38c3.png

e6dfcb18ab2ac2682ac8c69e4888e19c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值