Class 文件简介

Class 文件结构

Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在 Class 文件之中,中间没有添加任何分隔符,这使得整个 Class 文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。
当遇到需要占用 8 位字节以上空间的数据项时,则会按照高位在前(Big-Endian)的方式分割成若干个 8 位字节进行存储。

Class 文件只有两种数据类型:无符号数(基础类型)和表(引用类型)

  • 魔数
    校验文件类型的。例如java:cafababa

  • 版本

    • JDK1.8 = 52
    • JDK1.8 = 51
  • Class文件版本

  • 常量池

Constant Type Value
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18
  • 访问标志
  • 类索引,父类索引,接口索引集合
  • 字段表集合
  • 方法表集合
  • 属性表集合

Class 文件格式

u 代表基本信息, info代表复合信息

cp_info格式:

cp_info {
    u1 tag;
    u1 info[];
}
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]; // 各种属性
}

常量池对照表(对应cp_info的tag):

Constant Type Value
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18

参考网址:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html

ps:目标:根据代码可以手写class2进制文件

原文地址:https://www.cnblogs.com/snail-gao/p/11756542.html