分类: Java
2016-07-16 15:17:53
Class文件是一种以8位字节为基础的二进制流(所以用文本编辑器打开class文件呈现的是16进制代码)各个数据项目按照定义规范严格的排列在文件中,中间没有分隔符。但遇到需要占用8位以上的数据时,会采用高位在前的方式分割若干个八位字节存储。
根据java虚拟机规范。Class文件采用一种类似于c语言的结构体的伪结构进行存储。这种伪结构只有两种类型:无符号和表。
无符号数属于基本的数据类型,以u1,u2,u4,u8表示1,2,4,8个字节的无符号数,无符号数可以用来描述数字,索引引用,常量或utf-8编码构成的字符串值。
表是有多个无符号数或其他表作为数据项构成的复合数据类型,整个class文件就是一张表。
每个class前四个字节是用来确定这个文件能否被虚拟机接受。
0xCAFEBABE 代表着可以接受的, 0x0000代表着次版本号,0x0032(50)代表着主版本号,可以被jdk1.6或以上版本执行。姐姐这的constant_pool_count代表着常量池,由于常量池是不固定,所以需要放置一个计数器。0x00F9(249)(注意索引是从1开始的,所以公有248个常量)。这个常量并不是java语言中的常量,这个常量包含两种:一种是字面量(类似于java的常量),还有一种符号的引用包括三种类型:类和接口的全限定名。字段的名称和描述符。方法的名称和描述符。常量池中的每一个常量都是一个表。共有11种数据结构,这11中表有一个共同特点就是表开始的第一位是一个ul类型的标志位,代表当前这个常量属于哪种类型。
。07 代表着这是个constatnt_class_info。他的数据结构如下
Tag为标志位,name_index为指向当前常量池中的一个类型的偏移地址。02代表第二个常量为当前类名 01位constant_utf8_info的类型。
0x0039代表字符长度ask码翻译过来为com/landray/kmss/fs/apply/actions/BaseHistoryRecordAction
可以通过javap -verbose BaseHistoryRecordAction命令查看所有的变量。
常量池后面的类型access_flags代表着访问标志(2个字节)包括定义这个class是类还是接口,是Public private等
如果是多个类型应该采取|来进行操作
后面的this_class 和super_class分表代表着类索引和父类索引,interfacer,由于一个类只能有一个父类多个接口,所以具有interfacer_account
紧接着是(field_info)字段表,用来描述类或接口生命的变量。