Class类结构

来源:互联网 发布:淘宝模特发型女 编辑:程序博客网 时间:2024/06/06 19:16

Class类结构

定义:一组以8位字节为基础单位的二进制流。
特点:
- 各个数据项排列紧凑,字节没有添加任何分隔符
- 超过8位的数据项采取高位在前的方式
数据结构:伪结构体:包括无符号数和表
- 无符号数:是基本数据类型,含有u1,u2,u4,u8,可以用来描述数字,索引引用,数量值或安装UTF-8编制构成的字符串值。
- 表:复合型数据类型,由多个无符号数或其他表复合而成,表习惯以”_info”结尾,class文件就是一张表

魔数和Class文件版本

魔数:Class的头4个字节,标志文件是否能被虚拟机接受,Class文件的魔数为:0XCAFEBABE
版本号:接着魔数的4个字节,5,6字节为次版本号,7.8字节为主版本号

常量池

位于版本号之后
作用:Class文件的资源仓库
入口处有u2类型的计数器表示常量池的容量 Note:从1开始而不是0
存储内容:字面量,符合引用
字面量:java中的常量
符合引用:
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符

访问标志

常量池结束后的2个字节
标志类的访问信息:
类还是接口,是否定义为public,是否定义为abstract,是否被声明为final

类索引,父类索引与接口索引集合

作用:确定这个类的继承关系
类索引:1个u2,确定类的全限定名
父类索引:1个u2,确定类的父类,出Object之外所有类的父类索引都不为0
接口索引:1组u2,因为类支持多继承,接口索引集合第一项是u2类型的接口计数器

字段表集合

字段表用于描述接口或者类中声明的变量。
包括类级变量和实例级变量,不包括局部变量。
入口位还是有u2类型的计数器。
描述信息:
字段的作用域,是否static修饰,是否final修饰,并发可见性,是否被序列化,字段数据类型,字段名称。
Java语言中字段是无法重载的,但字节码来讲,如果两个字段的描述符不一致,那字段重名就合法。
描述符:基本数据类型以及代表无返回值的void类型都用大写字符表示,对象类型用字符L加对象的全限定名表示。

方法表集合

类比字段表。
方法内容存放在方法属性表集合中名为“Code”的属性里面。

在Java语言中,重载不能仅仅依靠返回值不,因为返回值不包含在特征签名中。
Class文件中,特征签名范围更大,只要描述符不是完全一致的2个方法也可以共存。

属性表集合

Code属性:方法体中的代码编译后,将字节码指令存储在Code属性内
Exceptions:列举方法中可能抛出的异常
LineNumberTable:描述Java源码行号和字节码行号之间的对应关系
LocalVariableTable:描述栈帧中局部变量与java源码中定义的变量之间的关系
SourceFile:记录生成这个Class文件的源码文件的名称。
ConstantValue:通知虚拟机自动为静态变量赋值
InnerClassesL:记录内部类与宿主类之间的关联
Deprecated:布尔属性,表示某个类,字段或者方法,已经被程序作者定为不再推荐使用,可以通过@deprecated
Synthetic:布尔属性,表示此字段或方法不是由Java源码产生,而是编译器自行添加的。

属性表集合中还有很多属性,这些属性有的属于类,字段,方法有的又属于属性表。

1 0
原创粉丝点击