类文件结构详解

类文件结构

class文件是一种8位字节的二进制流文件,class文件中的信息是一项一项排列的, 每项数据都有它的固定长度,其中u1、u2、u4、u8分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。

ClassFile { 
    u4 magic;  // 魔法数字,表明当前文件是.class文件,固定0xCAFEBABE
    u2 minor_version; // 分别为Class文件的副版本和主版本
    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]; // 各种属性
}

实例演示

创建一个空的person类,使用javac命令生成class文件放到sublime会生成一个16进制文本。一个字节表示2个16进制。

cafe babe 0000 0034 000d 0a00 0300 0a07
000b 0700 0c01 0006 3c69 6e69 743e 0100
0328 2956 0100 0443 6f64 6501 000f 4c69
6e65 4e75 6d62 6572 5461 626c 6501 000a
536f 7572 6365 4669 6c65 0100 0957 6f72
6b2e 6a61 7661 0c00 0400 0501 0008 636f
6d2f 576f 726b 0100 106a 6176 612f 6c61
6e67 2f4f 626a 6563 7400 2100 0200 0300
0000 0000 0100 0100 0400 0500 0100 0600
0000 1d00 0100 0100 0000 052a b700 01b1
0000 0001 0007 0000 0006 0001 0000 0002
0001 0008 0000 0002 0009

实例说明

u4 magic 一> 4个字节  一> cafe babe 
u2 minor_version  一> 2个字节->  0000
u2 major_version  一>  2个字节  一>  0034(对应10进制的52,代表JDK8的一个版本)
u2 constant_pool_count -> 2个字节 -> 000d(对应十进制13,代表常量池中13个常量)
发布了60 篇原创文章 · 获赞 1 · 访问量 3337

猜你喜欢

转载自blog.csdn.net/qq_16438883/article/details/103548232