简介
对于Java语言,程序员写出来的java程序是.java结尾的文件,此文件不能直接被计算机执行,需要经过编译处理,编译处理后的文件就是 .class文件,class文件中就是二进制字节码组成的内容,能够被jvm所识别执行。
Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息,在Java语言中的个中国变量、关键字和运算符号的语义都可以由多条字节码命令组成。
Class类文件的结构
- Class文件是一组以字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符,这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。
- Class文件中只有两种数据类型:无符号数和表
- 无符号数属于基本数据类型
- 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,用于描述有层次关系的复合结构的数据
Class文件结构组成:
- 魔数
- class文件版本
- 常量池
- 访问标志
- 类索引、父类索引、接口索引集合
- 字段表集合
- 方法表集合
- 属性表集合
在接下来的内容中,以u1、u2、u4、u8分别代表1个字节、2个字节、4个字节和8个字节的内容
因此,Class文件中,从0开始,结构组成与内容的关系:
- 魔数:4字节 cafe babe
- 注意,一般打开class文件是以十六进制的方式查看,而每个十六进制数可以用四位二进制表示,而一个字节为八位二进制,所以每个字节可以用两个十六进制数表示
- 版本号:4字节
- 版本号 = 次版本号 主版本号
- 常量池长度:2字节
- 假设是 001c,十进制就是 28,所以常量池一共有27项常量,每项常量的占用的字节数具体情况而定
- 常量池的容量计数是从1而不是0开始的
- 常量池:n字节
- 常量池中常量的数目取决于常量池长度的值
- 常量的种类就取决于程序员编写程序时的定义,因此常量池长度在不同的程序中是不同的
- 访问标志:2字节
- 访问标志用于识别一些类或者接口层次的访问信息,这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final等。
- 类索引:2字节
- 类索引用于确定这个类的全限定名
- 父类索引:2字节
- 父类索引用于确定这个类的父类的全限定名
- 接口索引集合:2字节
- 描述这个类实现了哪些接口
- 类索引、父类索引、接口索引集合,这三项数据确定了这个class文件类的继承关系
- 字段表集合:2+n字节
- 字段表中变量的个数:2字节
- 每个变量:2+2+2+n 字节:权限修饰符+属性名称+字段描述符+可能存在的属性表
- 描述接口或类中声明的变量
- 方法表集合:2+n字节
- 方法表中方法个数:2字节
- 每个方法:2+2+2+n 字节:权限修饰符+方法名称+方法描述+可能的属性表
- 属性表集合
参考
- 本文作者: xczll
- 本文链接: https://xczllgit.github.io/2020/03/28/jvm/2020-03-28-jvmClassByteCode/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!