/classFileReader

This is a experiment of format of JVM class file.

Primary LanguageJava

JVM Class File Format Experiment

  • Create models accroding to JVM class file format
  • Create some parser which can generate creating models

Output Example

ClassBody{
    magic=cafebabe,
    minorVersion=0,
    majorVersion=53,
    constantPoolCount=31,
    cpInfos=[
        CONSTANT_Methodref{
            classIndex=5,
            nameAndTypeIndex=20,
            tag=CONSTANT_Methodref
        },
        CONSTANT_Class{
            nameIndex=21,
            tag=CONSTANT_Class
        },
        CONSTANT_Methodref{
            classIndex=22,
            nameAndTypeIndex=23,
            tag=CONSTANT_Methodref
        },
        CONSTANT_Class{
            nameIndex=24,
            tag=CONSTANT_Class
        },
        CONSTANT_Class{
            nameIndex=25,
            tag=CONSTANT_Class
        },
        CONSTANT_Utf8{
            length=13,
            utf8String='SubTestLayout',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=12,
            utf8String='InnerClasses',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Class{
            nameIndex=26,
            tag=CONSTANT_Class
        },
        CONSTANT_Utf8{
            length=10,
            utf8String='TestLayout',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=6,
            utf8String='<init>',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=3,
            utf8String='()V',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=4,
            utf8String='Code',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=15,
            utf8String='LineNumberTable',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=4,
            utf8String='main',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=22,
            utf8String='([Ljava/lang/String;)V',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=10,
            utf8String='Exceptions',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Class{
            nameIndex=27,
            tag=CONSTANT_Class
        },
        CONSTANT_Utf8{
            length=10,
            utf8String='SourceFile',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=13,
            utf8String='JavaTest.java',
            tag=CONSTANT_Utf8
        },
        CONSTANT_NameAndType{
            nameIndex=10,
            descriptorIndex=11,
            tag=CONSTANT_NameAndType
        },
        CONSTANT_Utf8{
            length=22,
            utf8String='JavaTest$SubTestLayout',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Class{
            nameIndex=28,
            tag=CONSTANT_Class
        },
        CONSTANT_NameAndType{
            nameIndex=29,
            descriptorIndex=30,
            tag=CONSTANT_NameAndType
        },
        CONSTANT_Utf8{
            length=8,
            utf8String='JavaTest',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=16,
            utf8String='java/lang/Object',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=19,
            utf8String='JavaTest$TestLayout',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=19,
            utf8String='java/lang/Exception',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=15,
            utf8String='java/lang/Class',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=8,
            utf8String='toString',
            tag=CONSTANT_Utf8
        },
        CONSTANT_Utf8{
            length=20,
            utf8String='()Ljava/lang/String;',
            tag=CONSTANT_Utf8
        },
    ],
    accessFlag=ACC_PUBLIC|ACC_SUPER,
    thisClass=4,
    superClass=5,
    interfacesCount=0,
    interfaces=[],
    fieldsCount=0,
    fieldInfos=[

    ],
    methodsCount=2,
    methodInfos=[
        MethodInfo{
            accessFlags=ACC_PUBLIC,
            nameIndex=10,
            descriptorIndex=11,
            attributesCount=1,
            attributeInfos=[Code{attributeNameIndex=12, attributeLength=1, maxStack=1, maxLocals=1, codeLength=5, code=[42, -73, 0, 1, -79], exceptionTableLength=0, exceptionTable=[], attributesCount=0, attributeInfos=[AttributeInfo{attributeNameIndex=13, attributeLength=6, bytes=[0, 1, 0, 0, 0, 1]}]}]
        },
        MethodInfo{
            accessFlags=ACC_PUBLIC|ACC_STATIC,
            nameIndex=14,
            descriptorIndex=15,
            attributesCount=2,
            attributeInfos=[Code{attributeNameIndex=12, attributeLength=1, maxStack=1, maxLocals=1, codeLength=7, code=[18, 2, -74, 0, 3, 87, -79], exceptionTableLength=0, exceptionTable=[], attributesCount=0, attributeInfos=[AttributeInfo{attributeNameIndex=13, attributeLength=10, bytes=[0, 2, 0, 0, 0, 28, 0, 6, 0, 29]}]}, AttributeInfo{attributeNameIndex=16, attributeLength=4, bytes=[0, 1, 0, 17]}]
        },
    ],
    attributesCount=2,
    attributeInfos=[AttributeInfo{attributeNameIndex=18, attributeLength=2, bytes=[0, 19]}, AttributeInfo{attributeNameIndex=7, attributeLength=18, bytes=[0, 2, 0, 2, 0, 4, 0, 6, 0, 9, 0, 8, 0, 4, 0, 9, 0, 9]}]
}