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

11、类加载器

类加载:

  1. 加载:将类的字节码载入方法区中,内部采用C++的instanceKlass描述java类,它的重要field有:
    1. _java_mirror即java的类镜像,例如对String来说,就是String class,作用是把Klass暴露给java使用
    2. _super即父类
    3. _fields即成员变量
    4. _methods即方法
    5. _constants即常量池
    6. _class_loader即类加载器
    7. _vtable虚方法表
    8. _itable接口方法表
    9. 如果这个类还有父类没有加载,先加载父类
    10. 加载和链接可能是交替运行的

  1. 链接:
    1. 验证:验证类是否符合JVM规范,安全检查
    2. 准备:为static变量分配空间,设置默认值
      • static变量在jdk7前储存于instanceKlass末尾,从jdk7开始,储存于,_java_mirror末尾
      • static变量分配空间和赋值是两个步骤,分配空间在准备阶段完成,赋值在初始化阶段完成
      • 如果static变量是final的基本类型,以及字符串常量,那么编译阶段就确定了,赋值在准备阶段完成
      • 如果变量是final,但属于引用类型,那么赋值也会在初始化阶段完成
    3. 解析:将常量池中的符号引用解析为直接引用
  2. 初始化:初始化即调用<clinit>()v,虚拟机会保证这个类的构造方法线程安全。

发生的时机:

    1. 概括的说,类的初始化是懒惰的
    2. main方法所在的类,总会被首先初始化
    3. 首次访问这个类的静态变量或静态方法时
    4. 子类初始化,如果父类还没有初始化会引发
    5. 子类访问父类的静态变量,只会触发父类的初始化
    6. Class.forName
    7. new会导致初始化

不会导致类初始化的情况

  1. 访问类的static final静态常量(基本类型和字符串)不会触发初始化
  2. 类对象class不会触发初始化
  3. 创建该类的数组不会触发初始化
  4. 类加载器的loadClass方法
  5. Class.forName的参数2为flase时
  1. 类加载器:第一遍只是检查有没有加载,第二遍查自己加载的包下有没有,有就加载,没有就让子加载器加载(双亲委派)

  1. 启动类加载器:

  1. 扩展类加载器
  2.  双亲委派模式:指调用类加载器的loadClass方法时,查找类的规则
    1. 检查该类是否已经加载
    2. 如果有上级的话委派上级loadClass
    3. 如果没有上级了,则委派BoottrapClassLoader
    4. 每一层找不到,调用findClass方法(每个类加载器自己扩展)来加载
  3. 线程上下文加载器
  4. 自定义类加载器:

什么时候需要自定义加载器

    1. 想加载非classpath随意路径中的类文件
    2. 都是通过接口来使用实现,希望解耦时,常用在框架设计
    3. 这些类希望予以隔离,不同应用的同名类都可以加载,不冲突,常见于tomcat容器

步骤

  1. 继承ClassLoader父类
  2. 要遵从双亲委派机制,重写findClass方法(注意不是重写loadClass方法,否则不会走双亲委派机制)
  3. 读取类文件的字节码
  4. 调用父类的defineClass方法来加载类
  5. 使用调用该类加载器的loadClass方法
http://www.dtcms.com/a/263276.html

相关文章:

  • 项目:数据库应用系统开发:智能电商管理系统
  • 【Springai】项目实战进度和规划
  • 【FR801xH】富芮坤FR801xH之PMU GPIO
  • OpenCV CUDA模块设备层----- 正切(tangent)运算函数tan()
  • Python 数据分析与机器学习入门 (五):Matplotlib 数据可视化基础
  • R1-Searcher使用强化学习增强语言模型解决问题的搜索能力
  • WebSocket 的核心原理和工作流程
  • 前端Vue面试八股常考题(一)
  • 企业流程知识:《超越再造:以流程为中心的组织如何改变我们的工作和生活》读书笔记
  • 力扣面试150(7/150)
  • 【c/c++2】多线程,动静态库,信号,socket
  • 如何让宿主机完全看不到Wi-Fi?虚拟机独立联网隐匿上网实战!
  • 【知识图谱构建系列7】:结果评价(1)
  • 可编辑39页PPT | 数字化工厂蓝图整体框架建设举措建设路径实施路线规划建设方案
  • 从入门到精通:npm、npx、nvm 包管理工具详解及常用命令
  • Microsoft Edge 打开无反应、打开后显示兼容性问题、卸载重装 解决方案。一键卸载Microsoft Edge 。
  • 卫朋:华为流程体系拆解系列——IPD流程L1-L6分级导入实战演练
  • android BottomSheet及AlertDialog的几种material3 常见ui的用法
  • vue上传各种文件,并预览组件,(预览,下载),下载resources目录下文件
  • vmware 17 安装win11 24h2
  • 【解析】 微服务测试工具Parasoft SOAtest如何为响应式架构助力?
  • MongoDB 常见查询语法与命令详解
  • 设计模式精讲 Day 19:观察者模式(Observer Pattern)
  • 自由学习记录(64)
  • 傅里叶变换理解
  • Instruct-GPT奖励模型的损失函数与反向传播机制解析
  • opencv入门(1)环境变量配置
  • FOC中V/F启动和I/F启动的区别
  • 零成本接入+企业级部署:2025年AI大模型实战指南
  • 企业自建云概念解读|私有云、专有云、混合云、分布式云、企业云