JVM - 2 - 字节码文件结构

本章内容

  当我们编译好源文件后,得到字节码文件,使用winhex打开时,可以看到一堆16进制的字节,那么这些字节代表的是什么含义,我们会介绍到字节码总览图和常量池项目类型表,根据这两张表我们就可以分析出这些字节所代表的含义,现在就让我们来认识一下.

  说明:

    常量池的项目类型表来自于网络: https://www.jianshu.com/p/252f381a6bc4

 

知识点

 1 字节码总览图

 2 常量池项目类型表

 

字节码总览图

注意: Class文件中的数据项无论是顺序还是数量,都是被严格限定的,哪个字节代表什么意思,长度是什么样的,先后顺序如何,都是不允许改变的

 

字节码总览图
占用字节数 表示 介绍
4个字节 Magic Number 魔数,值为0xCAFFBABE
2+2个字节 Version 次版本号,主版本号,1.1(4.5),1.2(46),1.3(47),1.4(48),1.5(49),1.6(50),1.7(51)
2+n个字节 Constant Pool 常量池  包括字符串常量,数值常量等
2个字节 Access Flags 访问标记
2个字节 This Class Name 类索引
2个字节 Super Class Name 父类索引
2+n个字节 Interfaces 接口索引结合
2+n个字节 Fields 字段表集合
2+n个字节 Methods 方法表集合
2+n个字节 Attributes 属性表集合

 

 

 

 

 

 

 

 

 

 

 

 

 

常量池项目类型表

注意:U1代表1个字节,U2代表2个字节,U4代表4个字节,U8代表8个字节的无符号数

 

从此处开始分析字节码文件

字节码文件 

  

1 根据字节总览图 第一部分为魔数,占用四个字节 OXCAFEBABE (作用是用于确定这个文件是否为一个能被虚拟机接收的CLASS文件)

2 根据字节总览图 第二部分为版本号, (4,5字节)代表次版本号,(6,7字节)代表主版本号 33 16进制转10进制(51) 代表的是1.7.0(JDK版本)

3 根据字节总览图 第三部分为常量池 (2+n个字节)

  3.1 常量池主要存储2大类常量(字面量和符号引用) 字面量(文本字符串) 符号引用(类和接口的全局限定名,字段的名称和描述符,方法的名称和描述符)

  3.2 常量池分析 开始占用两个字节(入口代表常量池的数量) 0x0012 十六进制转10进制(18) 代表有17项常量(1-17 Class文件规定,设计者将第0项做了保留)

    #常量1 0x0A 转10进制 10 根据常量池项目类型表 代表的是:Methodref_info 这个还需要2个字节指向声明方法的接口描述符(0x0003) 以及指向名称及类型描述符(0x000F)

    #常量2 0X07 转10进制 7 根据常量池项目类型表 代表的是:Class_info  需要2个字节指向全向定名常量项的索引(0x0010)

    #常量3 0x07 转10进制 7 根据常量池项目类型表 代表的是:Class_info  需要2个字节指向全向定名常量项的索引(0x0011)

    #常量4 0x01 转10进制 1 根据常量池项目类型表 代表的是:utf8-info 

    。。。。。。。。。(未完待续)

 

猜你喜欢

转载自www.cnblogs.com/hpzhu/p/9323329.html