阅读更多
Class文件是一组以8位字节为基础的二进制流,各个数据项目严格按照顺序亲凑排列在Class文件当中。
Java虚拟机规范说,Class文件格式采用一种类似C语言结构体的伪结构来存储数据,这种伪数据只有两种数据类型,无符号数和表
(1) 无符号数属于基本的数据类型,以u1,u2,u4,u8来分别代表一个字节两个字节四个字节和八个字节,无符号数可以用来描述数字,索引引用,数量值或按照UTF-8编码构成字符串。
(2) 表是有多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性的以“_info”结尾,表用于描述有层次关系的复合结构的数据,整个class文件本质上就是一张表。
下边具体说一下Class文件各部分的内容
1每个Class文件的头四个字节成为魔数(Migic Number),
它的唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件。
2常量池
常量池可以理解为Class文件之中的资源仓库。
常量池中主要放置两大常量:字面量和符号引用。
(1) 字面量比较接近于JAVA语言层面的常量概念,如文本字符串,声明为final的常量值等。
(2) 符号引用包括三类常量:
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
Class文件不会保存各个方法,字段的最终内存布局信息。
3访问标志
用于标示类或者接口层次的访问信息,包括:
(1) 这个Class文件是类还是接口
(2) 是类还是注解
(3) 是类还是枚举
(4) 是否定义为public类型
(5) 是否定义为abstract类型
(6) 如果是类的话是否声明为final等。
4类索引,父类索引与接口索引集合。
顾明意思,存放三个数据来确定class文件对应的类的继承关系
类索引用于确定这个类的全限定名
父类索引用于确定这个类的父类的全限定名
接口索引用来描述这个类实现了哪些接口,一个集合
5,字段表集合
字段表(field_info)用于描述类或者接口中声明的变量。字段包括类级变量以及实例级变量(不包括方法体内的局部变量)
一个字段可以包括的信息:
字段作用域(public等)
是否是实例变量(是否有static修饰)
是否可变(final)
并发可见性(volatile,是否强制从主内存中读写)
可否被序列化(transient修饰符)
字段数据类型(基本类型,对象,数组)
字段名称
6,方法表集合
主要包括:
访问标志(public…)
是否static
是否final
是否为synchronzied
是否为native
是否为abstract
是否为strictfy
(注意volatile和transient只能修饰属性,不能修饰方法)
(方法的代码在方法属性表集合中的一个名为Code的属性里面)
7,属性表集合
在class文件和字段表和方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息。
其内容可以包括(只列出部分内容,未列全):
Java代码编译成的字节码指令(方法体)
final关键字定义的常量值
被声明为deprecated的方法和字段
方法抛出的异常
局部类或者匿名类
内部类列表
Java源码行号与字节码指令的对应关系
方法的局部变量描述
表示方法或字段为编译器自动生成
注解信息
用于保存invokedynamic指令引用的引导方法限定符