类文件结构

来源:互联网 发布:centos 7 1611下载 编辑:程序博客网 时间:2024/05/20 13:14

1 class类文件结构

这里写图片描述

class类文件是一组以8位字节为基础的二进制流。当遇到大于8字节的数据时,将高位在前 分割为多个8字节数据。类文件只有无符号数和表组成。

无符号数是基本数据类型,有u1,u2,u4,u8,分别占1,2,4,8字节。可以描述数字,索引引用,数量值等
表由无符号数和其他表组成。习惯以_info结尾。

1.1 magic 魔数

class文件的头四个字节称为魔数,唯一的作用是确定这个文件是否能被虚拟机接受的class文件。值是0xCAFEBABE.

1.2 minor_version major_version 主从版本

一个从版本号,一个主版本号

1.3 constant_pool_count/connstant_pool 常量池

常量池是class文件中的资源仓库。常量池中常量的数量不固定,使用constant_pool_count代表常量池容量计数值,计数值是从1开始的。0代表某些指向常量池的索引值数据在特定情况下需要表示 不引用任何常量池项目的意思。

常量池存放两类常量:字面量和符号引用
字面量类似java中常量的概念,如字符串/final修饰的变量
符号引用是编译原理的概念,指代
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符

常量池中每一项常量都是一个表,每一个表的开头都有一个u1开头的标志位,代表常量的类型,且每种常量表都有自己的数据结构
这里写图片描述
14种常量表的数据结构
这里写图片描述
这里写图片描述
这里写图片描述

1.4 access_flags 访问标志

用于标识当前类或接口的访问信息 一个class文件代表一个类或接口
这里写图片描述

1.5 this_class/super_class/interfaces 本类索引/父类索引/接口集合

作用是确定类的继承关系。
类索引和父类索引使用u2的索引值指向一个CONSTANT_class_info的类描述符常量,再通过CONSTANT_class_info的索引值找到定义在CONSTANT_Utf8_info中的全限定名字符串。
接口集合类似

1.6 fields

字段表用于描述接口和类中的全局变量和全局静态变量。
字段表的结构:
这里写图片描述

1.6.1 access_flags代表字段访问标志
这里写图片描述

1.6.2 name_index 变量的名称
1.6.3 descriptor_index 变量的修饰
这里写图片描述
数组使用 [ 标记。如String表示为 [[Ljava/lang/String

1.7 methods

与字段表类似
这里写图片描述
方法中具体的代码放在attributes中

这里写图片描述

1.8 atttibutes 属性表集合

在class文件,字段表,方法表都可以携带自己的属性表集合,用于描述一些专有信息。
参照《深入理解java虚拟机》第二版 6.3.7

2 java指令集

https://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

原创粉丝点击