class类文件结构
Java技术能够一直保持着非常良好的向后兼容性,Class文件结构的稳定功不可没,任何一门程序语言能够获得商业上的成功,都不可能去做升级版本后,旧版本编译的产品就不再能够运行这种事情。
Java虚拟机只关心是否是符合规定的Class文件,而不关心这个Class文件是由哪个语言编译而来的。
两位16进制数代表1字节,8位2进制数代表1字节。
class文件一定对应着唯一一个类或者是接口,但类和接口不一定有对应的class文件,因为在java中可以动态载入一些类和接口到类加载器,不需要先编译成class文件。
以8字节为单位的文件,数据紧凑排列没有分隔符,如果有些字段超过8字节,就分成好几个8字节的单位来表示它。
Class文件=无符号数+表
1.魔数
Class文件前四个字节存储的是该文件是否符合虚拟机规定的class文件的参数,紧接着后四个是版本号,5-6字节存储次版本号,7-8字节存储主版本号。
2. 常量池
常量池前面需要放置一些u2类型的数据,来表示长度不固定的常量池在这个class文件中的长度。
Class文件中只有常量池的计数从1开始,把0空出来是为了表达这个数字不引用任意一个常量,比如一个数据对于常量的索引是0,那么他就不引用任意一个常量。
常量池包含:
1、字面量
2、常量引用
常量池的每一个常量都是一个表,每个表总有个表名,下图类型那一列就是表名,且每个表的数据结构不一样,没有任何关联。每个类型相似的常量就存储在这个类型的表里。
Class中的方法和引用字段都需要使用Constant_Utf8_info来表示,其最大长度就代表java程序中方法和字段名的最大长度,有时候你的命名是符合规定,但是长度超了,编译器还是会报错。
3.访问标志
常量池结束后两个字节就是访问标志,其代表着这个class文件所代表的类或者接口,虚拟机应该用什么样的方式去访问,是类还是接口,私有还是公有?