Class文件格式与加载


Class文件格式与加载

类文件结构

  • 类文件结构也就是Class文件的结构
    • 魔数:用于标识Class文件的版本
    • 常量池:主要用于保存字面量(类似于字符串等)符号引用(类和接口的全限定名\字段名称以及描述符\方法名称和描述符); 由于jvm在加载Class文件时才会进行动态连接,因此需要保存这些方法或接口的信息
    • 访问标识:标识这个Class的类型(接口/类/public/abstract/final等)
    • 类索引、父类索引与接口索引集合
    • 字段表集合
    • 方法表集合
    • 属性表集合

虚拟机类加载机制:

  • 虚拟机把描述类的数据从Class文件加载到内存中,并对数据进行校验、转换解析、初始化的过程,最终形成可以被虚拟机之间使用的Java类型对象,就是虚拟机类的加载过程.

类加载的步骤

  1. 加载
  2. 连接:验证→准备→解析
  3. 初始化
  4. 使用
  5. 卸载

在执行顺序上:加载→验证→准备→解析→初始化,这五个步骤的顺序是固定的;

加载

  1. 通过类的全限定名来获取定义此类的二进制字节流
  2. 将二进制字节流转换为方法区运行时的数据结构
  3. 在内存中创建这个类的Class对象,作为方法区类结构的方法映射
  • 对于HotSpot虚拟机而言,Class对象比较特殊,它虽然是对象,但是存放在方法区内,作为访问类结构的对象接口

验证

  1. 文件格式的验证:文件格式\运行版本等
  2. 元数据的验证:对字节码语义信息的分析,
  3. 字节码内容的验证:通过程序来校验方法块中的内容是否正确

验证阶段贯穿[加载、准备、解析],并不是严格的线性的顺序

准备

  1. 为类变量分配内存并设置初始值的过程,对于类变量也仅仅是进行类型初始值的赋值(零值)
  2. final修饰的类变量在这个阶段会直接进行赋实际值的过程,因为final修饰的值会被当作常量

解析

  • 解析阶段是虚拟机将常量池中的符号引用替换为直接引用的过程
    1. 解析阶段会触发类的加载,当为找到Class对象时会根据类的全限定明进行加载
    2. 对字段会按照继承顺序从下先上进行查找,并校验访问权限
    3. 对类方法和接口方法的解析与字段类似

初始化

初始化就是在执行clint()的过程

clint()是编译器自动收集类中所有的类变量赋值动作和静态语句块合并生成的

静态代码块可以对在它之后的类变量进行赋值,但是不能进行访问;因为类变量在准备阶段就完成的零值的赋值

虚拟机内部保证了在执行器之类的clint()方法之前先执行父类的clint()方法

小结

Class文件整体加载结构

参考资料

java中的类加载器


  TOC