概述
一次编写,处处运行(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属性
…