一:前言
Java 虚拟机规范中规定了 Java 虚拟机结构、Class 类文件结构、字节码指令等内容,其中对于软件开发人员来说,类文件结构是有必要了解的一个内容。
Java 虚拟机的类文件结构是一组以 8 位字节为基础的二进制流,各数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全都是程序需要的数据,没有空隙存在。
java虚拟机执行的就是字节码文件。不论该字节码文件来自何方,由哪种编译器编译,甚至是手写字节码文件,只要符合java虚拟机的规范,那么它就能够执行该字节码文件。
Java文件:
public class Demo{
public static void main(String args[]){
System.out.println("Hello World.");
}
}
Java字节码文件:
二:Java类文件(字节码)结构
Java 虚拟机规范中定义了许多规范,其中有一部分定义了字节码的结构和规范。Java 虚拟机规范定义了两种数据类型来表示 Class 文件格式,分别是:无符号数和表。
无符号数:属于最基本的数据类型,以 u1、u2、u4、u8 六七分别代表 1 个字节、2 个字节、4 个字节、8 个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值或者按照 UTF-8 编码构成的字符串值。
表:是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以“_info”结尾,表用于描述有层次关系的复合结构的数据。
上面的表其实可以划分为以下七个部分,这七个部分组成了一个完整的 Class 字节码文件:
a.魔数与Class文件版本
b.常量池
c.访问标志
d.类索引、父类索引、接口索引
e.字段表集合
f.方法表集合
j.属性表集合
1.魔数与Class文件版本
Class 文件的第 1 - 4 个字节代表了该文件的魔数(Magic Number)。它唯一的作用是确定这个文件是否为一个能被虚拟机接受的 Class 文件,其值固定是:0xCAFEBABE(咖啡宝贝)。如果一个 Class 文件的魔数不是 0xCAFEBABE,那么虚拟机将拒绝运行这个文件。
Class 文件的第 5 - 6 个字节代表了 Class 文件的次版本号(Minor Version),即编译该 Class 文件的 JDK 次版本号。
Class 文件的第 7 - 8 个字节代表了 Class 文件的主版本号(Major Version),即编译该 Class 文件的 JDK 主版本号。
高版本的 JDK 能向下兼容以前版本的 Class 文件,但不能运行新版本的 Class 文件。例如一个 Class 文件是使用 JDK 1.5 编译的,那么我们可以用 JDK 1.7 虚拟机运行它,但不能用 JDK 1.4 虚拟机运行它。下表列出了各个版本 JDK 的十六进制版本号信息:
2.常量池
Class 文件的第 9 - 10 个字节用于表示常量池常量的个数(constant_pool_count),那么紧跟着就有 constant_pool_count - 1 个常量。
每个常量池的常量都用一个类型为 cp_info 的表表示,该表有 14 个值,分别是:
3.访问标志
在常量池结束之后,紧接着的两个字节代表访问标记(access_flags),这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口、是否定义为public类型、是否定义为abstract类型等。具体的标志位以及标志的含义见下表。
4.类索引、父类索引、接口索引
类索引:类索引用于确定这个类的全限定名,它用一个 u2 类型的数据表示。
父类索引:父类索引用于确定这个类的父类的全限定名,父类索引用一个u2类型的数据表示。
接口索引:接口索引集合就用来描述哪个类实现了哪些接口,这些被实现的接口将按 implements 语句(如果这个类本身就是一个接口,则应当是extends语句)后的接口顺序从左到右排列在接口索引集合中。对于接口索引集合,入口第一项是 u2 类型的数据为接口计数器(interfaces_count),表示索引表的容量,而在接口计数器后则紧跟着所有的接口信息。如果该类没有实现任何接口,则该计数器值为0,后面接口的索引表不再占用任何字节。
5.字段表集合
字段表集合用于描述接口或者类中声明的变量。这里说的字段包括类级变量和实例级变量,但不包括在方法内部声明的局部变量。
6.方法表集合
在字段表后的 2 个字节是一个方法计数器,表示类中总有有几个方法。在字段计数器后,才是具体的方法数据。方法表中的每个方法都用一个 method_info 表示,其数据结构如下:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-2213665/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/28624388/viewspace-2213665/