类文件结构
简介概述:
class 文件 是使用二进制的文件。
优点:存储,读取性能高。
文件是一组以8位字节为基础单位的二进制流,各个数据项严格顺序紧凑。
class 文件有两种数据类型:无符号数,表。
文件的排序是以严格规定好的顺序进行排列的,一旦内容有可变长度的变量,会在可变变量的前方加上一个变量个数属性,然后在开始继续有属性。
文件结构:
魔数:
用来表示文件的类型。放在class文件的前4个字节。class文件的魔数为 cafebaby 。
class文件版本号:
占据4个字节,高版本的jdk能够兼容低版本的 class 文件。
常量池数量:
常量池的数量。
常量池: ( 工具:javap -verbose xxx.class )
是以 cp_info 的形式存在的。
常量池中的第 0 项常量空出来是有特殊的考虑的,是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的意思。
访问标志:
用于识别一些类或接口层次的访问信息,包括这个class是类还是接口,是否定义为public类型,是否定义为abstract类型。
在字节码文件中,系统默认给接口加上抽象类标识符号。
class文件中查出来的值,是我们类访问标志表相对应数值相加起来的。
类索引,父类索引,接口索引集合:
类索引为指向常量池的位置。
父类索引也是指向常量池的位置。
接口索引集合:为先给出接口的个数,后面各个就是为指向常量池的相对位置。
字段表集合:
方法表集合:
属性表集合:(存储有字节码指令)
在class 文件中,字段表,方法表中都可能携带自己的属性表集合。
其中的code属性:
code->Maxstack: 操作数栈的最大深度。
->MaxLocals:代表局部变量所需空间
->codeLength,code;字节码指令
code_length:有一个特点,在虚拟机规范中,有限制了一个方法不允许超过65535条字节指令。如果超出这个限制,javac会拒绝编译。经常出现编译复杂的 jsp 中。
code属性是class文件中最重要的一个属性,如果把java程序的信息分为代码和元数据,code用于描述代码,所有其他的数据项目就是用于描述元数据。
还有一个问题需要注意:
我们在实例方法中没有定义任何一个局部变量,但是 arg_size 和 locals为什么会等于 1.因为是通过 javac 编译器在编译的时候把对 this 关键字的访问,然后在虚拟机调用方法时自动传入此参数就可以。