标签:block method oracle cafe tab ade code inter htm
? 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
访问标志
类索引,父类索引,接口索引集合
字段表集合
方法表集合
属性表集合
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
目标:根据代码可以手写class2进制文件
标签:block method oracle cafe tab ade code inter htm
原文地址:https://www.cnblogs.com/snail-gao/p/11756542.html