other class class_file - ceragon/JvmThreadDoc GitHub Wiki
class ClassFileParser {
private:
Symbol* _class_name;
const InstanceKlass* _super_klass;
// 常量池
ConstantPool* _cp;
Array<u2>* _fields;
Array<Method*>* _methods;
u2 _major_version;
u2 _minor_version;
};类文件解析
void ClassFileParser::parse_stream(const ClassFileStream* const stream, TRAPS) {
// ============ 魔数 ==============
const u4 magic = stream->get_u4_fast();
// =================================
// ============= 版本号 =============
_minor_version = stream->get_u2_fast();
_major_version = stream->get_u2_fast();
// ================================
// ======= 常量池解析 =========
// 常量池的大小,单位字节
u2 cp_size = stream->get_u2_fast();
_orig_cp_size = cp_size;
if (is_hidden()) { // Add a slot for hidden class name.
cp_size++;
}
// 为常量池在元空间中分配空间
_cp = ConstantPool::allocate(_loader_data, cp_size, CHECK);
ConstantPool* const cp = _cp;
parse_constant_pool(stream, cp, _orig_cp_size, CHECK);
// ===========================
// ======== 类的访问标志 ===========
jint flags;
// JVM_ACC_MODULE is defined in JDK-9 and later.
if (_major_version >= JAVA_9_VERSION) {
flags = stream->get_u2_fast() & (JVM_RECOGNIZED_CLASS_MODIFIERS | JVM_ACC_MODULE);
} else {
flags = stream->get_u2_fast() & JVM_RECOGNIZED_CLASS_MODIFIERS;
}
if ((flags & JVM_ACC_INTERFACE) && _major_version < JAVA_6_VERSION) {
// Set abstract bit for old class files for backward compatibility
flags |= JVM_ACC_ABSTRACT;
}
_access_flags.set_flags(flags);
// ================================
// =============== 类在常量池的索引 =========
_this_class_index = stream->get_u2_fast();
// 获取类名称
Symbol* const class_name_in_cp = cp->klass_name_at(_this_class_index);
// ========================================
// =============== 父类在常量池的索引 ========
_super_class_index = stream->get_u2_fast();
_super_klass = parse_super_class(cp, _super_class_index, _need_verify, CHECK);
// =======================================
// =============== 接口列表 ===============
_itfs_len = stream->get_u2_fast();
parse_interfaces(stream, _itfs_len, cp, &_has_nonstatic_concrete_methods, CHECK);
// ======================================
// =============== 字段列表 ==============
fac = new FieldAllocationCount();
parse_fields(stream, _access_flags.is_interface(), _fac, cp, cp_size, &_java_fields_count, CHECK);
// =====================================
// ============== 方法列表 ==============
AccessFlags promoted_flags;
parse_methods(stream,_access_flags.is_interface(), &promoted_flags, &_has_final_method, &_declares_nonstatic_concrete_methods, CHECK);
// ====================================
// ============== 类文件的属性 ==========
_parsed_annotations = new ClassAnnotationCollector();
parse_classfile_attributes(stream, cp, _parsed_annotations, CHECK);
// ====================================
}