class类文件的结构
class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,没有任何分隔符
class文件格式采用一种伪结构来存储数据,这个伪结构只有两种数据类型:
1 无符号数:基本的数据类型,可以用来描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值
2 表:由多个无符号数或者其他表作为数据项构成的复合数据类型
魔数与Class文件的版本
每个Class文件的头4个字节称为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件
紧接着魔数的4个字节存储的是Class文件的版本号
常量池
版本号之后是常量池,常量池可以理解为Class文件之中的资源仓库,它是与其他项目关联最多的数据类型,
也是占用空间最大的数据项目之一,还是Class文件中第一个出现的表类型数据项目
访问标志
常量池结束后,紧接着两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息
类索引、父类索引与接口索引集合
Class文件由这三项数据来确定这个类的继承关系
字段表集合
字段表用于描述接口或者类中声明的变量,包括类级变量和实例级变量
方法表集合
依次包括了访问标志、名称索引、描述符索引、属性表集合几项
方法里的java代码,经过编译器编译成字节码指令后,放在方法属性表集合中一个“code”的属性里面
属性表集合
在Class文件、字段表、方法表都可以携带自己的属性表集合,用于描述某些场景专有的信息
字节码指令简介
java虚拟机的指令由一个字节长度、代表着某种特定操作含义的数字(操作码)以及跟随其后的0至多个代表此操作所需参数构成
java虚拟机采用面向操作数栈的架构,所以大多数指令都不包含操作数,只有一个操作码
字节码与数据类型
在java虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息
加载和存储指令
运算指令
类型转换指令
对象创建与访问指令
操作数栈管理指令
控制转移指令
方法调用和返回指令
异常处理指令
同步指令
公有设计和私有实现
来源:https://www.cnblogs.com/liulanle/p/4087638.html