class文件结构与jvm字节码指令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37636695/article/details/84335937

https://blog.csdn.net/luckydog1991/article/details/51654964这篇文章详细的介绍了class文件和字节码指令

Class文件结构

https://blog.csdn.net/tyrone1979/article/details/964560

class文件是一组以8位字节为基础单位的二进制流;

当遇到8位字节以上的空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。

class文件中有2中数据类型,分别是无符号数和表;

  • 魔数
  • Class文件版本
  • 常量池
  • 访问标志
  • 类索引、父类索引、接口索引集合
  • 字段表集合
  • 方法表集合
  • 属性表集合

u4 magic;                                 //识别Class文件格式,具体值为0xCAFEBABE,

              u2 minor_version;            // Class文件格式副版本号,

              u2 major_version;            // Class文件格式主版本号,

              u2 constant_pool_count; //  常数表项个数,

              cp_info **constant_pool;// 常数表,又称变长符号表,

扫描二维码关注公众号,回复: 4265325 查看本文章

              u2 access_flags;               //Class的声明中使用的修饰符掩码,

              u2 this_class;                   //常数表索引,索引内保存类名或接口名,

              u2 super_class;                //常数表索引,索引内保存父类名,

              u2 interfaces_count;        //超接口个数,

              u2 *interfaces;                 //常数表索引,各超接口名称,

              u2 fields_count;       //类的域个数,

              field_info **fields;          //域数据,包括属性名称索引,

//域修饰符掩码等,

              u2 methods_count;          //方法个数,

              method_info **methods;//方法数据,包括方法名称索引,方法修饰符掩码等,

              u2 attributes_count;        //类附加属性个数,

              attribute_info **attributes; //类附加属性数据,包括源文件名等。

魔数

CA FE BA BE 4位16进制数,转换为二进制数为(3405691582)

class文件是以他开始,如果虚拟机找不到他,直接报错

Class文件版本

00 00 00 34 魔数后4位

前2位次版本号

后2位主版本号为:jdk1.8 52

常量池

可以使用javap工具进行反编译,得到相关的数据。

javap -verbose HelloWord.class

  cp_info **constant_pool;// 常数表,又称变长符号表,

访问标志

u2 access_flags;               //Class的声明中使用的修饰符掩码

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

    u2 this_class;                   //常数表索引,索引内保存类名或接口名,

              u2 super_class;                //常数表索引,索引内保存父类名,

              u2 interfaces_count;        //超接口个数,

              u2 *interfaces;                 //常数表索引,各超接口名称,

字段表集合

    u2 fields_count;       //类的域个数,

            field_info **fields; //域数据,包括属性名称索引,

//域修饰符掩码等,

方法表集合

  u2 methods_count;          //方法个数,

         method_info **methods;//方法数据,包括方法名称索引,方法修饰符掩码等,

属性表集合

  u2 attributes_count;        //类附加属性个数,

         attribute_info **attributes; //类附加属性数据,包括源文件名等。

字节码指令

Java虚拟机的指令由一个字节长度的,代表着某种特定操作还有的数字,称之为操作码,以及跟随其后的0至多个代表此操作所需参数的操作数而构成。

操作码的长度为1个字节,因此最大只有265条。

基于栈的指令架构

在虚拟机的指令集中,大多数的指令都包含了其操作所对应的数据类型信息。

iload fload

大多数指令是包含类型信息的

也有不包含类型信息的

goto 与类型无关

Arraylength 操作数组类型

类型多,指令少

虚拟机指令的具体的分类

加载和存储指令

加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传输。

    • 将局部变量表加载到操作数栈:iload lload fload dload aload
    • 将一个数值从操作数栈存储到局部变量表:istore lfda
    • 将一个常量加载到操作数栈:bipush sipush ldc ldc_w ldc2_w aconst_null iconst_m1 iconst
    • 扩充局部变量表访问指令:wide

运算指令

类型转换指令

对象的创建与访问指令

操作树栈指令

方法的调用和返回指令

异常处理指令

同步指令

猜你喜欢

转载自blog.csdn.net/qq_37636695/article/details/84335937