other class class_file - ceragon/JvmThreadDoc GitHub Wiki

class 文件源码

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);
    // ====================================
}
⚠️ **GitHub.com Fallback** ⚠️