Please enable JavaScript.
Coggle requires JavaScript to display documents.
类文件结构, 采用两种数据结构 无符号数 和 表
无符号数: 基本数据类型 u1、u2、u4、u8 分别代表几个字节
表:…
类文件结构
- 魔数为CAFEBABE
- Class版本分为次版本和主版本JDK8 为52
- 表类型数据项目,主要存放,字面量和符号引用
- 每一个常量都是一个表
- 具体有17种常量类型
- CONSTANT_UTF8_info类型常量最大长度为65535即最大能描述的容量64K
- javap -verbose xxx.class 查看字节码
- 字面量:类似常量比如文本字符串、final修饰的常量值
- 符号引用:
- 被模块导出或者开放的包
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
- 方法句柄和方法类型
- 动态调用点和动态常量
- 常量池结束后的两个字节表示access_flag
- 用于识别类或者接口层次的信息
- 通常有如:ACC_PUBLIC、ACC_FINAL
- 类、父类索引是一个u2类型的数据类型
- 接口索引是一个集合代表可以实现多个接口
- 用于描述接口或者类种声明的变量,不包括局部变量
- 每个字段使用一个表,
- access_flag: 字段访问标志,比如ACC_PUBLIC、ACC_STATIC
- name_index: 字段的简单名称 对常量池项的引用
- descriptor_index: 字段和方法的描述符 是一个对常量池项的引用
- 描述符是用来描述字段的数据类型、方法的参数列表、返回值类型
- 比如char类型使用C表示,float使用F表示
- 对象类型使用L加全限定名表示
- 数组使用
[
加数据类型表示有一层加一个[
- int getAge(char[] name) 表示为 "
([C)I
"
- 后面可能会跟一个属性表集合用来描述额外信息
- 用来对方法的描述,具体结构与字段表类似
- accss_flag ACC_SYNCHRONIZED表示是同步方法
- 重载一个方法需要有不同的方法特征签名
- 方法体放在了Code属性里面
code属性
- 方法体中的代码在Javac编译器处理后,最终变成字节码存在Code属性中
- max_stack代表了操作数栈的最大深度,虚拟机运行时需要根据此来分配栈帧中的操作栈深度
- max_locals 代表局部变量表所需的存储空间,单位是变量槽,当代码执行超出一个局部变量的作用域时,该变量占用的槽可被复用,会根据生存的最大局部变量数量和类型确定该值大小
- code_length/code 用来存储JAVA源程序编译后生成的字节码指令,指令有200多种
- 方法参数默认会注入 this
- 通过异常表来处理try catch的异常
-
- 采用两种数据结构 无符号数 和 表
- 无符号数: 基本数据类型 u1、u2、u4、u8 分别代表几个字节
- 表: 描述具有层次关系的数据结构