Class文件结构

Class类文件的结构

类型名称数量
u4magic(魔数)1
u2minor_version(此版本号)1
u2major_version(主版本号)1
u2constant_pool_count(常量池容量计数值)1
cp_infoconstant_pool(常量池表)constant_pool_count-1
u2access_flags(访问标志)1
u2this_class(类索引)1
u2super_class(父类索引)1
u2interfaces_count(接口计数值)1
u2interfaces(接口索引表)interfaces_count
u2fields_count(字段表计数值)1
field_infofields(字段表)fields_count
u2methods_count(方法计数值)1
method_infomethod(方法表)methods_count
u2attributes_count(属性表计数值)1
attribute_infoattributes(属性表)attributes_count
实例解析:

创建一个接口以便后面查看接口索引表

public interface Hello {
    void function();
}

创建用例TestClassFile类

public class TestClassFile implements Hello{
    public int a=1;
    static int b=2;

    @Override
    public void function()
    {
        int x=a+b;
    }
    public int method(){
        int y=b;
        return y;
    }
    public static void main(String[]args){
        Hello hello=new TestClassFile();
        hello.function();
    }
}

编译后得到字节码class文件,用Win-Hex打开
在这里插入图片描述

开始逐个分析:
在这里插入图片描述
前4个字节,魔数:0xCAFEBABE 所有的class文件都必须包含它,它的作用是确定这个文件是一个能被虚拟机接收的class文件。JDK主版本号从45(JDK1.1)开始每个大版本发布主版本号加1.
在这里插入图片描述
这里给出一个常量池中的14中常量项的结构表:

常量项目类型描述
CONSTANT_Utf8_infotagu11
lengthu2utf-8编码的字符串占用的字节数
bytesu1长度为length的utf-8编码的字符串
CONSTANT_Integer_infotagu13
bytesu4按照高位在前存储的int值
CONSTANT_Float_infotagu14
bytesu4按照高位在前存储的float值
CONSTANT_Long_infotagu15
bytesu8按照高位在前存储的long值
CONSTANT_Double_infotagu16
bytesu8按照高位在前存储的double值
CONSTANT_Class_infotagu17
indexu2指向全限定名常量项的索引
CONSTANT_String_infotagu18
indexu2指向字符串字面量的索引
CONSTANT_Fieldref_infotagu19
indexu2指向声明字段的类或接口描述符CONSTANT_Class_info的索引项
indexu2指向字段描述符CONSTANT_NameAndType的索引项
CONSTANT_Methodref_infotagu110
indexu2指向声明方法的类描述符CONSTANT_Class_info的索引项
indexu2指向名称及类型描述符CONSTANT_NameAndType的索引项
CONSTANT_Interface-Methodref_infotagu111
indexu2指向声明方法接口描述符CONSTANT_Class_info的索引项
indexu2指向名称及类型描述符CONSTANT_NameAndType的索引项
CONSTANT_NameAndType_infotagu112
indexu2指向该字段或方法名称常量项的索引
indexu2指向该字段或方法描述符常量项的索引
CONSTANT_MethodHandle_infotagu115
reference_kindu1该值必须在1-9之间(包括1和9),它决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为
reference_indexu2必须是对常量池的有效索引
CONSTANT_MethodType_infotagu116
descriptor_indexu2该值必须是对常量池的有效索引,常量池在该索引处的项必须是CONSTANT_Utf-8_info结构,表示方法的描述符
CONSTANT_InvokeDynamic_infotagu118
bootstrap_method_attr_indexu2该值必须是对当前class文件中引导方法表的bootstrap_methods[]数组的有效索引
name_and_type_indexu2该值必须是对当前常量池的有效索引,常量池在该索引处的项必须是CONSTANT_NameAndType_info结构,表示方法名和方法描述符

表Constant.info
命令:javap -verbose 类名.class

图2

常量池:

从常量计数值开始后面紧跟着39个常量项,第一个常量的偏移量为0x0000000000A
在这里插入图片描述
每一个常量项都是一个表,表头是一个tag标识,可以通过tag号查上面的Constant.info表。
得知 tag:0x0A 查表tag=10的项,为COSTANT_Methodref_info,根据该常量项的结构tag后面是两个2字节的索引项:0x0007,0x0021分别是第7项常量和第33项常量,查看上面图2,第一个常量确实是Methodref且指向7和33号常量。同理接下来的是第2个常量。

暂停!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值