class组成结构
2017-11-21 14:16:16 0 举报
AI智能生成
java class类组成结构
作者其他创作
大纲/内容
8字节为最小单位来存储
没有分隔符
大端方式编译
包含数据结构
无符号数
以u1 u2 u4 u8等来表示的无符号字节
u后面的数字表示字节的长度
表
由多个无符号数或者其他表构成的复杂数据结构
以_info结尾
14种类型
通过开头的u1来标识类型
每种类型有不同的数据结构
整个class本质上就是一张表
特别说明
java中的方法字段都是使用UTF8_INFO表来表示
这个表长度是使用一个u2来进行存储的,所以java中的方法、字段、变量等都不能超过2的16次方
即最大长度为65535 64kb
具体文件结构
魔数
0xCAFEBABE
版本号
次版本号
u2
主板本号
u2
从45开始,每个大版本+1
常量池
计数值
u2
从1开始,当为0时表示该class不引用任何一个常量池项目
常量
以表为数据结构
字面量
接近于java语言层面的常量比如文本字符串,final声明的常量值
符号引用
类和接口的全限定名
例如:com.javanewb.class.test
字段的名称和描述符
方法的名称和描述符
运作方式
从常量池获得对应的符号引用,再在类创建时或者运行时解析、翻译到具体的内存地址中
访问标志
u2
用于识别类或者接口层次的访问信息
class是类还是接口
是什么访问限制
public等
是否定义为abstract
如果是类是否被生命为final
类索引
u2
指向常量池中一个class_info表
确定这个类的全限定名
父类索引
u2
指向常量池中一个class_info表
确定这个类的父类
如果没有父类,那就是顶层父类object
接口索引集合
u2数据的集合
入口第一项u2是计数器,记录集合的总数
确定这个类实现的接口,如果本身是interface那么这个是extends
字段表
field_info表
用于描述接口或者类中声明的变量
包括类级变量以及实例变量,但是不包含方法内部的局部变量
有可能出现原本java类中不存在的字段
比如内部类为了保证对外部类的访问性,会自动添加只想外部类实例的字段
不会出现父类或父接口中继承来的字段
方法表集合
method_info表
入口通过一个u2来表示方法数量
方法里面的java代码经过编译器编译成字节码指令,存放在方法属性表中一个名为code的属性中
如果父类方法在子类没有被重写便不会出现
有可能出现编译器自动添加的方法
clinit
类构造器
init
实例构造器
属性表集合
在class文件、字段表、方法表都会携带自己的属性表集合
用于描述某些场景专用的信息
每个属性表没有固定长度限制
但是不能属性名重复
jvm会忽略掉不认识的属性
对于每个属性,他的名称需要从常量池的utf8_info类型常量来表示
属性值的结构完全自定义的
只需要使用一个u4的属性去说明属性值所占用的长度即可
0 条评论
下一页