Class类文件结构简述
Class文件是一组以八个字节为基础单位的二进制流,采用高位在前的方式分割成若干个8个字节进行存储,高位在前的存储的方式参考深入计算机操作系统,亦可面向百度
魔数和Class文件的版本
魔数(Magic Number)仅用于确定该class文件能被虚拟机接受,值为0xCAFEBABE,再魔数之后的四个字节,是Java的次版本号和主版本号,5,6字节为次版本号,7,8字节为主版本号.
常量池
在主次版本号后,是常量池入口,常量的数量不固定,需要一项u2类型的数据,代表常量池容量计数值.这个计数值从1开始,不是从0开始,如16进制的16,为10进制的22,代表21个常量值,索引值为1-21,不引用任何一个常量池项目,索引值为0来表示,在Class文件结构中只有常量池容量计数从1开始.
常量池主要存放两大类常量:字面量和符号引用,每一项常量都是一个表,每一个常量表都存在tag,tag表示常量类型,name_index是常量池中的索引值,指向一个CONSTANT_Utf8-_info类型常量,代表着这个类或接口的全限定名,CONSTANT_Utf8-_info得表结构除了tag,还存在u2类型的length,和u1类型的bytes,length的最大值为u2类型的最大值65535,所以如果Java程序中定义了超过64kb的变量或方法名,规则正确也无法编译.
访问标志
常量池结束后,紧接的两个字节是访问标志,比如类,接口,抽象类,public,final,enum等的访问信息.
类索引,父类索引,接口索引
类索引,父类索引都是一个u2类型的数据,接口索引是u2类型数据的集合,Class文件根据这三项来确定继承关系
接口索引集合,入口为一个接口计数器.
字段表集合
字段表用于描述接口或类中声明的变量,Java中的字段分为实例级变量和类级变量,不包括方法内部声明的局部变量.字段表结构
方法表集合
在Java中重载一个方法,除了需要具有相同的简单名称之外,还必须要求有一个与原方法不同的特征签名.特征签名指一个方法中各个参数在常量池中的字符按符号引用的集合,所以返回值不会包含在特征签名中.
属性表集合
在JavaSE12版本中增加到了29项,属性表不做详解.Code表为关键
以上内容参考深入理解Java虚拟机