u2 minor_version; u2 major_version; //CLASS文件结构主次版本号 JAVA2支持45.0-46. 0 u2 constant_pool_count; //记录常量信息 cp_info constant_pool[constant_pool_count-1]; //计数从1开始 u2 access_flags; //class/interface访问权限 u2 this_class; //指向constant_poll中的有效索引值 u2 super_class; //0或指向constant_poll中的有效索引值,对于in terface必须为非0 u2 interfaces_count; //superinterfaces的个数 u2 interfaces[interfaces_count]; //计数[0,count-1) 对应constant_po ol中的一个索引值 u2 fields_count; field_info fields[fields_count]; //主要用于记录class及实例中的变量 u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; }
此时cp_info分别对应结构变化为 1. CONSTANT_Class CONSTANT_Class_info { u1 tag; u2 name_index; }
2. CONSTANT_Fieldref CONSTANT_Fieldref_info { u1 tag; u2 class_index; //constant_pool的索引,对应CONSTANT_Class_ info u2 name_and_type_index;//constant_pool的索引,对应CONSTANT_ NameAndType_info }
3. CONSTANT_Methodref CONSTANT_Methodref_info { u1 tag; u2 class_index; u2 name_and_type_index; }
4. CONSTANT_InterfaceMethodref CONSTANT_InterfaceMethodref_info { u1 tag; u2 class_index; u2 name_and_type_index;
}
5. CONSTANT_String CONSTANT_String_info { u1 tag; u2 string_index; }
u4 attribute_length; u2 max_stack; //执行此函数时可用的栈的最大深度 u2 max_locals; //执行此函数可用到的最大本地变量数目,包括参 数。 // 注重:一个long/double相当于2个变量数目. u4 code_length; //本函数用到的代码长度。 u1 code[code_length]; //实现本函数的真正字节码 u2 exception_table_length; { u2 start_pc; u2 end_pc; //捕捉违例时执行代码数组中的[start_pc, end_p c)部分 u2 handler_pc; //现在还不大明白他是干嘛的!! u2 catch_type; //指向constant_pool的索引,对应CONSTANT _Class_info }exception_table[exception_table_length];