Class类文件结构
Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。Class文件格式采用一种类似C语言结构体的伪结构体存储两种数据类型:无符号数、表。表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表习惯以“_info”结尾。
Class文件格式
1.魔数(magic)
每个Class文件的头4个文件称为魔数,作用:确定这个文件是否为一个能被虚拟机接受的Class文件。
2.minor_version & major_version
Class文件的版本号。
3.constan_pool_count & constant_pool
constan_pool_count常量池容量计数值,这个计数值是从1开始。
常量池中每一项常量都是表。表开始的第一位是一个u1类型的标志位(tag),代表当前这个常量属于那种常量类型。
常量池主要存放两大类常量:字面量、符号引用。符号引用:1.类和接口的权限定名称;2.字段的名称和描述符;3.方法名称和描述符。
4.访问标志(access_flags)
这个标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。
5.类索引(this_class)
类索引用于确定这个类的权限定名。
6.父类索引(super_class)
父类索引用于确定这个类的父类的权限定名。
7.接口索引(interfaces_count & interfaces)
接口索引集合用于确定这个类实现了那些接口。
8.字段表集合(fields_count & fields)
用于描述类或者接口中声明的变量(不包括局部变量)。不会列出从超类或者父接口中继承而来的字段。
9.方法集合(methods_count & methods)
methods_count的计数只包括在该类或接口中显示定义的方法,不包括从超类或父接口继承来的方法.
Java重载一个方法,必须要求拥有一个与原方法不同的特征签名,特征签名就是一个方法中各个参数在常量池中的字段符号引用的集合,也就是因为返回值不会包括在特征签名中,无法仅仅依靠返回值不同来对一个已有的方法进行重载。
10.属性集合(attribute_info_count & attribute_info)
在Class文件、字段表、方法表都可以携带自己的属性表集合。