当前位置: 正文

jvm中类和对象定义存储基础知识

1 类文件数据结构类型 Class文件结构主要有两种数据结构:无符号数和表 •无符号数:用来表述数字,索引引用、数量值以及字符串等,比如 图1中类型为u1,u2,u4,u8分别代表1个字节,2个字节,4个字节,8个字节的无符号数 •表:表是有由多个无符号数以及其它的表组成的复合结构,比如图1中类型以_info结尾的项为表类型。

admin

2 类结构定义 Class类文件是紧凑、顺序、无空隙的,魔数(MagicNumber)、Class文件版本(Version)、常量池(Constant_Pool)、访问标记(Access_flag)、本类(This_class)、父类(Super_class)、接口(Interfaces)、字段集合(Fields)、方法集合(Methods )、属性集合(Attributes)。其中因为java多继承所以interfaces接口类型为数组;attribute_info则是方法表中定义的code索引,指向具体的方法体字节码。如图1所示。


2.1 魔法数 前四个字节cafebabe是固定值,任何语言编译成jvm认识的二进制流,前四位必须是固定的cafebabe字节。 2.2 版本号 紧接着2个字节00表示次版本号为0 ;0034代表主版本为52(jdk版本号对应的jdk版本为1.8)参考jdk版本和class字节版本的对应关系 2.3 常量个数 常量个数const_pool_count字节码为00 20对应的说明常量个数为32,实际为31个,因为首位jvm作为保留位使用。 2.4 常量池 常量池存放两大常量:字面量和符号引,字面量如文本字符串,被生命的final常量值等,而符号引用则包含类、接口的全限名称、字段、方法名称和描述符号等等。参考javap生成的类文件信息。 这里只分析下其中一个常量,在上面常量个数2个字节后面紧接着一个字节0a十进制为10,参考常量池类型10代表类中方法的符号引用。继续参考方法类型MethodRef_info个格式定义:前两个字节0004代表方法所在类名称的索引,后两个字节0001a代表一个NameAndType类型的索引。

返回顶部