6.2 无关性的基石
实现语言无关性的基础是虚拟机和字节码存储格式。各种语言都可以通过对应编译器转成class文件在虚拟机运行。
6.3class类文件的结构
class类文件对应唯一一个类或接口的定义信息,类或接口并不定都定义在文件里(也可以通过类加载器直接生成类或接口)
class文件是以8字节为基础单位的二进制流 ,各个数据项目严格按照顺序紧凑排列在class文件中。当数据项超过8位字节,则以‘big-endian’方式存储。
大端模式Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。
小端模式Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。
内存地址 Little-Endian Big-Endian
0x4000 0x78 0x12
0x4001 0x56 0x34
0x4002 0x34 0x56
0x4003 0x12 0x78
class文件只有两种数据类型:无符号数 和 表
无符号数以u1,u2,u4,u8分别表示1个字节,2个字节,4个字节,8个字节的无符号数,它可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
表是由多个无符号数或者多个表组成的。习惯性以_info 结尾,整个class文件本质就是一张表,由一下数据项构成。
- class文件格式
类型 | 名称 | 数量 |
---|---|---|
u4 | magic | 1 |
u2 | minor_version | 1 |
u2 | major_version | 1 |
u2 | constant_pool_count | 1 |
cp_info | constant_pool | constant_pool_count-1 |
u2 | access_flags | 1 |
u2 | this_class | 1 |
u2 | super_class | 1 |
u2 | interface_count | 1 |
u2 | interfaces | interface_count |
u2 | fields_count | 1 |
field_info | fields | fields_count |
u2 | methods_count | 1 |
method_info | methods | methods_count |
u2 | attributes_count | 1 |
attribute_info | attributes | attributes_count |