深入理解Java虚拟机----(五)类文件结构

    虚拟机不与任何语言绑定,只与字节码这种二进制文件绑定。许多基于jvm的语言,都被编译成固定格式的字节码文件,具有了一致性,然后可以被统一的虚拟机执行。
Class文件结构:
    class结构只有两种数据结构:
  • 无符号数:基本数据结构,u1、u2、u4、u8代表1、2、4、8个字节的无符号数。可以描述数字、引用、UTF-8的字符串。
  • 表:由无符号数组成的符合类型。整个class文件本质上就是一张表。
    包含以下几部分:
  • 魔数:0xCAFEBABE
  • 版本:四字节
  • 常量池:首先是u2类型的计数,从1开始。常量池中主要存放两类数据:
    • 字面量:文本字符串、fianl常量等。
    • 符号引用:(c++有链接这一步,java没有,而是在运行时动态链接,也就是解析这些符号引用,翻译到具体的内存地址)
      • 类和接口的权限定名
      • 字段和方法的名称和描述符
          常量池中每个常量都是一个表,表开头都是u1类型的标记,代表这个常量的类型,共14种。每种的数据结构还不相同。
  • 访问标志:两字节表示类的访问信息。
  • 类索引、父类索引、接口索引集合:确定类的继承关系。前两项是u2类型,第三个是集合。通过索引可以在前面的常量表中查找内容。所以java只能继承一个父类,可以实现多个接口。
  • 字段表:描述声明的变量。
  • 方法表:描述方法。不包括代码,代码被fangdao属性表中。
  • 属性表
字节码指令:
    指令是由一个字节的操作码和后面0到多个的参数构成的,但jvm采用的是面向操作数栈而不是寄存器的架构,所以多数都只有一个操作码。只有一字节,所以总数最多256个。包括:
  • 加载、存储指令:用于将数据在局部表量表和操作数栈中传输
  • 运算指令:对操作数栈中的值进行运算,将结果写回操作数栈。
  • 类型转换指令
  • 对象创建与访问指令:创建对象、数组,访问字段、元素等。
  • 操作数栈管理指令:交换、出栈等。
  • 控制转移指令:控制下一条执行指令的位置。
  • 方法调用和返回指令
  • 异常处理指令
  • 同步指令
    

你可能感兴趣的:(深入理解Java虚拟机----(五)类文件结构)