《深入理解java虚拟机》读书笔记
2020-06-23 20:35:52 20 举报
AI智能生成
Java的class文件结构
作者其他创作
大纲/内容
魔数与class文件的版本
魔数0xCAFEBABE,占头4个字节
版本号,占4个字节,5-6字节次版本号,7-8字节主版本号
常量池
头2个字节标识常量池大小,即容量 cpsize
具体常量池的内容,有cpsize-1项,每一项都是一张表,主要分为以下两类常量
字面量 Literal,比如
文本字符串
final常量值
符号引用 Symbolic References
类和接口的全限定名 Fully Qualified Name
字段的名称和描述符 Descriptor
方法的名称和描述符
访问标志
占2个字节,用于标识类或接口级别的访问信息,比如此class文件是类还是接口,是否是public,是否是abstract,是否是final。例如,标志ACC_PUBLIC
类索引、父类索引与接口索引集合
类索引,占2个字节,用于确定这个类的全限定名
父类索引,占2个字节,因为java不允许多继承,故有且仅有一个,用于确定这个类的父类的全限定名
接口索引,因为java允许实现多接口,故其占用2*n个字节。用于描述这个类实现了哪些接口
字段表集合
类级别的变量
实例级别的变量
方法表集合
类似于字段表的,只不过方法表用来描述方法
属性表集合
Code属性
存放方法体代码的字节码
Exceptions属性
列举方法的 throws关键字后面的异常
LineNumberTable属性
描述Java源码行号与字节码行号(字节码的偏移量)之间的对应关系
ps:这是可选项,不生成的话,影响有二
程序抛出异常时,堆栈信息不会显示出错的行号
debug的时候,无法按照源码行设置断点
LocalVariableTable属性
可选项,描述栈帧局部变量表中的变量与java源码中定义的变量的关系
SourceFile属性
记录此class文件的源码文件名称
ConstantValue属性
通知jvm自动为static类型的变量赋值,这个属性只有static类型的变量才能使用
InnerClass属性
记录内部类与宿主类之间的关联
Deprecated属性和Synthetic属性
Deprecated标识某个类、字段、方法不再被推荐使用
Synthetic代表此字段或方法不是由Java源码直接产生,而是由编译器自行添加
StackMapTable属性
被类型检查器使用
Signature属性
记录泛型类型,弥补java伪泛型的缺陷
BootstrapMethods属性
保存invokedynamic指令引用的引导方法限定符
一些前提约定:u1-u8分别代表1-8个字节的无符号数
0 条评论
下一页