类文件结构

Class文件中只有两种数据类型:无符号数和表。

无符号数属于基本数据类型:u1,u2.u4.u8分半表示1,2,4,8个字节的无符号数。用来描述数组,索引引用,数据值或者按utf-8编码的字符串值。

表是多个无符号数和表构成,习惯以_info结尾。

整个class文件本质就是一张表。

image

class文件的组成是按上述表的大小和内容组成的。

image

1.魔数和class文件的版本

u4是固定的CAFEBABE

u2次版本号00 00

u2主版本号00 33 版本号为1.7

image

二、常量池

u2常量池计数值,从1开始

常量池中主要放两大类常量:字面量和符号引用(字面量比较接近于Java的常量概念。如文本字符串、声明finald的常量值等;符号艺勇则属于编译原理方面的概念:类和接口的全限定名,字段的名称和描述,字符的名称符和描述符)。

常量池中每一项常量都是一个表。

image

表的开始第一位都是一个u1表示为,取值如上表。

0x0000000A是0x07对照上表是CONSTANT_Class_info

其常量的结构

image

对照class文件图0x0002 即指向了第二个索引的常量

0x01是utf-8类型的常量,其结构表

image

image

其他的可以使用Jdk bin下面的工具javap

image

其他的常量结构表如下

image

image

三、访问标志

在常量池结束后紧接着两个字节代表访问标志。标识类或接口的访问信息。

包括:class是类还是接口,是否是public,是否是abstract,是类的话,是否被声明final

image

该类为普通类0x0021

四、类索引、父类索引与接口索引集合

紧接着访问类型之后是类索引(u2)、父类索引(u2)、与接口索引集合(u2集合)

image

0x0001 0x0003 0x0000 分别表示类,父类,索引集合

五、字段表集合

字段主要包括的信息:字段的作用域,是否可以实例化,可变性,并发性,类型,名称。

image

 

image

个数,修饰符,名称索引,描述索引,

private int age;

image

image

六、属性表集合

在class文件、字段表、方法表都可以携带自己的属性表,用于描述某些场景的特有信息。

由于涉及到的内容太多,可以直接使用javap –verbose来查看其含义。

posted @ 2017-07-24 16:12  javabeginer  阅读(515)  评论(0编辑  收藏  举报