首页 > 编程语言 >Java基础之ClassFile文件结构

Java基础之ClassFile文件结构

时间:2022-09-20 16:35:49浏览次数:88  
标签:count 文件 ClassFile Java attribute u2 info attributes class

本文相关知识均来自:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

.class文件都遵循ClassFile结构:

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}
类型 描述 备注
u4 magic 魔数:0xCAFEBABE
u2 minor_version 小版本号
u2 major_version 主版本号
u2 constant_pool_count 常量池大小,从1开始
cp_info constant_pool[constant_pool_count - 1] 常量池信息
u2 access_flags 访问标志
u2 this_class 类索引(指向常量池)
u2 super_class 父类索引(指向常量池)
u2 interfaces_count 接口个数
u2 interfaces[interfaces_count] 接口类索引信息(指向常量池)
u2 fields_count 字段数
field_info fields[fields_count] 字段表信息
u2 methods_count 方法数(默认有构造方法<init>:()V,所以该项至少为1)
method_info methods[methods_count] 方法表信息
u2 attributes_count 属性个数
attribute_info attributes[attributes_count] 属性表信息

u1: 表示占用1个字节
u2: 表示占用2个字节
u4: 表示占用4个字节
u8: 表示占用8个字节
cp_infofield_infomethod_infoattribute_info表示较为复杂的结构,它们也是由u1、u2、u4和u8组成

cp_info 结构:

cp_info {
    u1 tag;
    u1 info[];
}

相应的,在.class文件当中,定义的字段,要遵循 field_info 的结构。

field_info {
    u2             access_flags;
    u2             name_index;
    u2             descriptor_index;
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

同样的,在.class文件当中,定义的方法,要遵循method_info的结构。

method_info {
    u2             access_flags;
    u2             name_index;
    u2             descriptor_index;
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

在method_info结构中,方法当中方法体的代码,是存在于 Code属性结构中,其结构如下:

Code_attribute {
    u2 attribute_name_index;
    u4 attribute_length;
    u2 max_stack;
    u2 max_locals;
    u4 code_length;
    u1 code[code_length];
    u2 exception_table_length;
    {   u2 start_pc;
        u2 end_pc;
        u2 handler_pc;
        u2 catch_type;
    } exception_table[exception_table_length];
    u2 attributes_count;
    attribute_info attributes[attributes_count];
}

标签:count,文件,ClassFile,Java,attribute,u2,info,attributes,class
From: https://www.cnblogs.com/iw1waoejlfo2lo/p/16711483.html

相关文章