class文件的属性解析是非常复杂的,因为属性表由非常多的类型组成,几乎每一个数据类型都不一样,而且属性表是动态的,它还会随着JDK的版本升级而新增属性对象。在class文件中:成员变量
、成员方法
、类
都拥有属性信息,解析的时候可以使用同样的方法。因为属性表中的属性类型过多,本节仅以解析ConstantValue
、Code
为例,完整的解析代码请参考ClassByteCodeParser类。
属性信息表数据结构:
u2 attributes_count;
attribute_info attributes[attributes_count];
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
u2 attributes_count;
表示的是属性表的长度,循环所有属性对象可得到attribute_info
对象。attribute_info
对象有两个固定的属性值:u2 attribute_name_index;
(属性名称)和u4 attribute_length;
(属性的字节长度),我们可以先解析出这两个属性:
// u2 attribute_name_index;
String attributeName = (String) getConstantPoolValue(dis.readUnsignedShort());
// u4 attribute_length;
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 |