java虚拟机-字节码文件结构
1.java语言与java虚拟机的关系
得益于虚拟机,java被称为跨平台的语言。
同时,java虚拟机也可以被看作是跨语言的平台。java虚拟机不与任何语言(包括java)绑定,它只与Class文件 这种特定的二进制文件强关联。任何语言,只要能编译成符合特定规则的Class文件,就都可以在java虚拟机上运行。如下图1 所示:
图1 java虚拟机与语言的关系
2.Class文件结构
任何一个Class文件都对应着一个类或一个接口的定义信息。但是反过来,类或接口不一定都得定义在文件里,因为还可以动态生成,直接送入类加载器中。
Class文件是一组以8个字节为单位的二进制流,按严格顺序排列,没有任何分隔符。
Class文件采用 “无符号数” 和 “表” 来记录数据。
2.1 无符号数
其中,无符号数是基本的数据类型,u1,u2,u4,u8来分别代表1,2,4,8个字节的无符号数。无符号数可以描述数字,索引引用,数量值或者以UTF-8编码的字符串值。
2.2 表
表是由多个无符号数或者其他表作为数据项构成的数据结构。以_info结尾。整个Class文件本身可视为一张表。
2.3.Class文件记录结构
2.3.1 魔数(magic number)
Class文件的前4个字节是固定的,值为cafebabe.是该字节码文件是否可以被虚拟机接受的标识。
紧接着魔数后的四个字节是java的版本号。《Java虚拟机规范》中明确规定:即使字节码文件结构没有任何改变,也不允许虚拟机执行超过其版本号的Class文件。
2.3.2 常量池