Chinaunix首页 | 论坛 | 博客
  • 博客访问: 17320
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 211
  • 用 户 组: 普通用户
  • 注册时间: 2015-12-09 16:47
文章分类

全部博文(21)

文章存档

2017年(1)

2016年(9)

2015年(11)

我的朋友
最近访客

分类: 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代表着常量池,由于常量池是不固定,所以需要放置一个计数器。0x00F9249)(注意索引是从1开始的,所以公有248个常量)。这个常量并不是java语言中的常量,这个常量包含两种:一种是字面量(类似于java的常量),还有一种符号的引用包括三种类型:类和接口的全限定名。字段的名称和描述符。方法的名称和描述符。常量池中的每一个常量都是一个表。共有11种数据结构,这11中表有一个共同特点就是表开始的第一位是一个ul类型的标志位,代表当前这个常量属于哪种类型。

07 代表着这是个constatnt_class_info。他的数据结构如下

Tag为标志位,name_index为指向当前常量池中的一个类型的偏移地址。02代表第二个常量为当前类名 01constant_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)字段表,用来描述类或接口生命的变量。

 

阅读(363) | 评论(0) | 转发(0) |
0

上一篇:虚拟机性能监控

下一篇:虚拟机加载机制

给主人留下些什么吧!~~