class文件的属性解析是非常复杂的,因为属性表由非常多的类型组成,几乎每一个数据类型都不一样,而且属性表是动态的,它还会随着JDK的版本升级而新增属性对象。在class文件中:成员变量成员方法都拥有属性信息,解析的时候可以使用同样的方法。因为属性表中的属性类型过多,本节仅以解析ConstantValueCode为例,完整的解析代码请参考ClassByteCodeParser类
    属性信息表数据结构:

    1. u2 attributes_count;
    2. attribute_info attributes[attributes_count];
    3. attribute_info {
    4. u2 attribute_name_index;
    5. u4 attribute_length;
    6. u1 info[attribute_length];
    7. }

    u2 attributes_count;表示的是属性表的长度,循环所有属性对象可得到attribute_info对象。attribute_info对象有两个固定的属性值:u2 attribute_name_index;(属性名称)和u4 attribute_length;(属性的字节长度),我们可以先解析出这两个属性:

    1. // u2 attribute_name_index;
    2. String attributeName = (String) getConstantPoolValue(dis.readUnsignedShort());
    3. // u4 attribute_length;
    4. int attributeLength = dis.readInt();

    解析出属性名称后就需要参考JVM虚拟机规范第4.7章-属性来解析各类属性信息了。

    预定义属性表**

    属性名称 属性位置 章节 Java版本
    ConstantValue field_info §4.7.2 1.0.2
    Code method_info §4.7.3 1.0.2
    StackMapTable Code §4.7.4 6
    Exceptions method_info §4.7.5 1.0.2
    InnerClasses ClassFile §4.7.6 1.1
    EnclosingMethod ClassFile §4.7.7 5.0
    Synthetic ClassFile, field_info, method_info §4.7.8 1.1
    Signature ClassFile, field_info, method_info §4.7.9 5.0
    SourceFile ClassFile §4.7.10 1.0.2
    SourceDebugExtension ClassFile §4.7.11 5.0
    LineNumberTable Code §4.7.12 1.0.2
    LocalVariableTable Code §4.7.13 1.0.2
    LocalVariableTypeTable Code §4.7.14 5.0
    Deprecated ClassFile, field_info, method_info §4.7.15 1.1
    RuntimeVisibleAnnotations ClassFile, field_info, method_info §4.7.16 5.0
    RuntimeInvisibleAnnotations ClassFile, field_info, method_info §4.7.17 5.0
    RuntimeVisibleParameterAnnotations method_info §4.7.18 5.0
    RuntimeInvisibleParameterAnnotations method_info §4.7.19 5.0
    RuntimeVisibleTypeAnnotations ClassFile, field_info, method_info, Code §4.7.20 8
    RuntimeInvisibleTypeAnnotations ClassFile, field_info, method_info, Code §4.7.21 8
    AnnotationDefault method_info §4.7.22 5.0
    BootstrapMethods ClassFile §4.7.23 7
    MethodParameters method_info §4.7.24 8
    Module ClassFile §4.7.25 9
    ModulePackages ClassFile §4.7.26 9
    ModuleMainClass ClassFile §4.7.27 9
    NestHost ClassFile §4.7.28 11
    NestMembers ClassFile §4.7.29 11