每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象。
字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,方法数量及方法表,属性属性及属性表,jvm中使用类c结构体表示每一种属性,结构体中类型种类有两种,无符号数及表,以 _info结尾表示表,以 u1,u2,u4,u8分别表示1字节,2字节,4字节,8字节无符号数
ClassFile{
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count];
u2 acc_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];
}
魔术:四个字节,用于定义此字节码文件是否符合虚拟机规范,保证字节码文件不会威胁虚拟机的安全,若为cafebabe则表示字节码符合虚拟机规范
主次版本号:四个字节,前两字节表示次版本号,后两字节表示主版本号,用于定义编译的字节码文件格式版本,低版本虚拟机拒绝运行高版本字节码文件,但高版本虚拟机会向下兼容低版本字节码文件
常量池数量及常量池表:这部分主要统计类或接口的字面量和符号引用,用于每个类或接口拥有的字面量和符号引用属性不一定相同,所有需要两个字节的长度来表示常量池数目,常量池数目计数从1开始,比如类或接口中总共有两个字面量符号引用,则常量池数目为2,注意,不是从0开始计数,0可能另有用处,可以用来表示类或接口中未出现的引用,用来表示超级父类Java.long.Object全限定名的索引,常量池表是一个数组,一共有18种类型,每一种类型有一个tag属性与之对应,constant_utf8_info用于表示文本字符串,类和接口全限定名,字段名称及描述符,方法名称及描述符等常量信息,constant_integer_info用于存储int类型的常量信息,只存储int类型的值,不存储其他符合引用信息,比如 final int a=1 符号引用信息为a,值为1,constant_float_info用于存储float类型常量信息,也是只存储float值,不存储引用信息,constant_long_info用于存储long类型的常量信息,constant_double_info用于存储double类型的常量信息,constant_class_info用于存储指向常量池列表constant_unf8_info类和接口全限定名的有效引用,constant_string_info用于存储指定常量池列表constant_utf8_info某常量项的有效索引,指向文本字符串,constant_fieldref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_methodref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_interfacemethodref_info用于存储指向常量池列表constant_class_info常量项和constant_nameandtype_info常量项的有效索引,constant_nameandtype_info用于存储指向常量池列表constant_utf8_info常量项的有效索引,可以通过所有找到对应类及描述符,constant_methodtype_info用于存储指向常量池constant_utf8_info常量项,表示方法类型,找到对应的方法描述符,constant_methodhandle_info用于表示方法句柄,属性reference_kind表示方法句柄的类型,1-4表示为字段创建的方法句柄,5-8表示为类方法(构造、实例、静态)创建的句柄,9表示为接口方法创建的句柄,reference_index属性指向根据reference_kind对应的常量池列表,constant_invokedynamic_info用于存储当前字节码文件中引导方法bootstrap_method数组的有效索引和指向常量池constant_nameandtype_info常量项的有效索引
constant_utf8_info{
u1 tag;
u2 length;
u1 bytes[length];
}
constant_integer_info{
u1 tag;
u4 bytes;
}
constant_float_info{
u1 tag;
u4 float;
}
constant_long_info{
u1 falg;
u8 long;
}
constant_double_info{
u1 tag;
u4 double;
}
constant_class_info{
u1 tag;
u2 name_index;
}
constant_string_info{
u1 tag;
u2 string_index;
}
constant_fieldref_info{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
constant_mathodref_info{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
constant_interfacemathodref_info{
u1 tag;
u2 class_index;
u2 name_and_type_index;
}
constant_nameandtype_info{
u1 tag;
u2 class_index;
u2 descriptor_index;
}
constant_methodhandle_info{
u1 tag;
u2 reference_kind;
u2 reference_index;
}
constant_methodtype_info{
u1 tag;
u2 descriptor_index;
}
constant_invokedynamic_info{
u1 tag;
u2 bootstrap_method_attr_index;
u2 name_and_type_index;
}