概述

  • 一次编写,处处运行(Write Once, Run Anywhere).
  • 各种平台的虚拟机与所有平台都统一使用的程序存储格式-字节码(ByteCode).
  • Java虚拟机不和包括Java在内任何语言绑定,它只与Class文件锁关联.因此Groovy,JRuby,Jython,Scala都可以在Java虚拟机上运行.

Class类文件结构

Class文件是一组以8字节为基础单位的二进制流,中间没有任何空隙和分隔符.

1.魔数

前4个字节表示魔数0xCAFEBABE

2.版本号

接下来是4个字节,前2个字节是次版本号,后2个字节是主版本号

3.常量池

  • 存在两大常量:字面量(literal)和符号引号(Symbolic References).
  • 常量池中每一项常量都是一个表.

4. 访问标志

常量池紧接两个字节代表访问标志(access_flags),识别是类、接口、public类型、abstract类型、final类型。

5.类索引、父类索引与接口索引集合

类索引、父类索引与接口索引都是u2类型数据,索引对应常量池项,这三项确定类的继承关系。

6.字段表集合

字段表用于描述类或接口声明的变量。

7.方法表的集合

字段表用于描述方法。

8.属性表集合

  • code属性

javac编译后变成字节码指令存储在code属性中。包括操作数栈max_stack和存储空间max_locals。其中max_locals的单位是slot。slot是虚拟机为局部变量分配内存的最小大小。对应32位数据来说,每个局部变量占用1个slot,64位的占有2个slot。

  • Signature属性

记录泛型类型。

  • Exception属性
  • ConstantValue属性
  • SourceFile属性