当前位置: 首页 > ops >正文

java类加载器

Java 虚拟机设计团队有意把类加载阶段中的“通过一个类的全限定名来获取描述该类的二进制字节流”这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需的类。实现这个动作的代码被称为“类加载器”(Class Loader)

类和类加载器:

对于任意一个类,都必须由加载它的类加载器和这个类本身一起共同确立其在 Java 虚拟机中的唯一性

每一个类加载器,都拥有一个独立的类名称空间

也就是说两个类是否相等,只有在这两个类是由同一个类加载器加载的情况下才有意义

这里所指的“相等”,包括代表类的 Class 对象的 equals()方法、isAssignableFrom()方 法、isInstance()方法的返回结果,也包括了使用 instanceof 关键字做对象所属关系判定等各种情况

双亲委派模型:

站在虚拟机的角度来看,类加载器只有两种,一个是启动类加载器,是由C++写的,是虚拟机自身的一部 分;另外一种就是其他所有的类加载器,都由 Java 语言实现,独立在于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader

启动类加载器:

负责加载存放在 \lib 目录,或者被-Xbootclasspath 参数所指定的路径中存放的, 而且是 Java 虚拟机能够识别的类库加载到虚拟机的内存中

启动类加载器无法被 Java 程序直接引用,用户在编写自定义类加载器时,如果需要把加载请求委派给引导 类加载器去处理,那直接使用 null 代替即可(约定的规范)

扩展类加载器:

在类 sun.misc.Launcher$ExtClassLoader 中以 Java 代码的形式实现的。它负责加载 \lib\ext 目录中,或者被 java.ext.dirs 系统变量所指定的路径中所有的类库

JDK 的开发团队允许用户将具有通用性的类库放置在 ext 目录里以扩展 Java SE 的功能

应用程序类加载器:

由 sun.misc.Launcher$AppClassLoader 来实现。

由于应用程序类加载器是 ClassLoader 类中 的 getSystem-ClassLoader()方法的返回值,所以有些场合中也称它为“系统类加载器”。

负责加载用户类路径(ClassPath)上所有的类库

可以加入自定义的类加载器来进行拓展,典型的如增加除了磁盘位置之外 的 Class 文件来源,或者通过类加载器实现类的隔离、重载等功能

双亲委派模型:

 工作流程:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个请求委派给父类加载器去完成,每一个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层的启动类加载器中,只有当父加载器反馈自己无法完成这个加载请求(它的搜索范围中没有找到所需的类)时, 子加载器才会尝试自己去完成加载

双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器

这里类加载器之间的父子关系一般不是以继承(Inheritance)的关系来实现的,而是通常使用组合 (Composition)关系来复用父加载器的代码

为什么不是继承:

逻辑解耦:因为继承的话子类加载器就必须完全继承父类加载器的行为,难以灵活控制,实际的需求只是子类加载器借用父类加载器的能力,不是完全继承

动态替换和扩展难:继承是静态的,在编译时期就确定了,但类加载器可能需要在运行时动态切换或添加父类加载器

违反单一职责原则:如果一个类加载器既负责自己的加载策略,又继承了另一个加载器的全部功能,这会让职责变得模糊

代码实现:在ClassLoader里的loadclass方法中

http://www.xdnf.cn/news/9172.html

相关文章:

  • 树莓派超全系列教程文档--(50)如何查找树莓派的IP地址
  • 计算机组成与体系结构:硬盘驱动器(Hard Disk Drives)
  • OpenGL Chan视频学习-9 Index Buffers inOpenGL
  • STM32F407VET6学习笔记6:定时器TIM2的配置使用
  • MPLS实验复现
  • 70页精品PPT | 休闲食品行业数据分析平台建设方案快消BI大数据解决方案BI方案
  • [ Qt ] | 常用控件(三):
  • AR眼镜+AI视频盒子+视频监控联网平台:消防救援的智能革命
  • 板凳-------Mysql cookbook学习 (七)
  • 钠离子电池循环寿命突破万次
  • [网页五子棋][用户模块]客户端开发(登录功能和注册功能)
  • 【C语言】排序方法
  • web常见的攻击方式(下)
  • nvm和node的环境配置与下载
  • Windows Telnet 正在连接xxx...无法打开到主机的连接。 在端口 xxx: 连接失败
  • 电脑主板VGA长亮白灯
  • 2025-05-27 学习记录--Python-模块
  • NGINX HTTP/3 实验指南安装、配置与调优
  • PromQL 从基础入门教程
  • LVS负载均衡
  • 【免费】【无需登录/关注】卫星影像在线下载网页
  • 实战分享:DolphinScheduler 中 Shell 任务环境变量最佳配置方式
  • K8s边缘集群赋能工业自动化:从传感器监控到智能决策的全流程升级
  • Pic手机拼图软件:创意拼图,轻松上手
  • React JSX语法介绍(JS XML)(一种JS语法扩展,允许在JS代码中编写类似HTML的标记语言)Babel编译
  • ​扣子Coze飞书多维表插件-查询数据
  • 【无标题】使用JEasyOpc开发OPCDA采集中间件
  • Lua中的`self`参数:揭秘隐藏的“对象上下文”
  • 1992-2021年各省工业增加值数据(无缺失)
  • Linux的五种IO模型