SmallVMJavaJavaClassJavaClassJavaGolangClass

Class文件

ClassJavaClassClassClass
JavaClassCJavau1u2u4u81248ClassSmallVMu1u2u4u8uint8uint16uint32uint64Class
type ClassFile struct {
    magic             uint32
    minorVersion      uint16
    majorVersion      uint16
    constantPoolCount uint16
    constantPool      []constantpool.ConstantInfo
    accessFlags       uint16
    thisClass         uint16
    superClass        uint16
    interfacesCount   uint16
    interfaces        []uint16
    fieldsCount       uint16
    fields            []FieldInfo
    methodsCount      uint16
    methods           []MethodInfo
    attributesCount   uint16
    attributes        []attribute.AttributeInfo
}

type FieldInfo struct {
    accessFlags     uint16
    nameIndex       uint16
    descriptorIndex uint16
    attributesCount uint16
    attributes      []attribute.AttributeInfo
}

type MethodInfo struct {
    accessFlags     uint16
    nameIndex       uint16
    descriptorIndex uint16
    attributesCount uint16
    attributes      []attribute.AttributeInfo
}

如何解析

ClassClassClass4Class
ClassJava
u1tagconstantPoolCount1constantPoolCount47461constantPoolCount471~460CONSTANT_Long_infoCONSTANT_Double_infonn+2n+1CONSTANT_Utf8_infou1tagu2lengthlengthu1byteslengthMUTF-8Modified UTF-8)MUTF-8UTF-8null20xC00x80UTF-16
ClassJavaSmallVMtagu2attribute_name_indexattribute_name_indexCONSTANT_Utf8_infoSmallVMattribute_name_index
u2access_flagsu2name_indexu2descriptor_indexu2attributes_countattributes_countattribute_infoattributesattributes
Classaccess_flagsCodeCodeJavaSmallVMCode
type Code struct {
    pool                 []constantpool.ConstantInfo
    attributeNameIndex   uint16
    attributeLength      uint32
    maxStack             uint16
    maxLocals            uint16
    codeLength           uint32
    code                 []byte
    exceptionTableLength uint16
    exceptionTable       []ExceptionInfo
    attributesCount      uint16
    attributes           []AttributeInfo
}

type ExceptionInfo struct {
    startPc   uint16
    endPc     uint16
    handlerPc uint16
    catchType uint16
}
CodecodeLengthcodeu1codecodeLengthu465535

代码实现

ClassSmallVMsrc/classfileClassClass