Java Class文件格式之属性详解
在Java中,每个类都有一个对应的.class
文件,它包含了该类的所有信息,包括成员变量、方法等。.class
文件由以下几个部分构成:
- 魔数:4个字节,用于标识
.class
文件是否合法,固定值为0xCAFEBABE。 - 版本号:4个字节,分别表示主版本号和次版本号,用于标识该文件所对应的JVM版本。
- 常量池:变长结构,存储类中使用到的常量。
- 访问标志:2个字节,表示该类的访问修饰符。
- 类索引、父类索引、接口索引集合:均为2个字节。
- 字段表集合:变长结构,存储该类中的字段信息。
- 方法表集合:变长结构,存储该类中的方法信息。
- 属性表集合:变长结构,存储该类中的属性信息。
本篇攻略将详细讲解Java Class文件格式中的属性表集合。
属性表集合
属性表集合是.class
文件的一部分,用于存储类、字段或方法的额外信息。属性表集合的构成如下:
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
其中:
attribute_name_index
表示属性名的常量池索引。attribute_length
表示信息长度。info
表示具体的信息,长度为attribute_length
。
在Java Class文件格式中,共有23种属性,具体如下:
属性名称 | 含义 |
---|---|
ConstantValue |
字段的常量值 |
Code |
存储方法的字节码 |
StackMapTable |
存储栈帧映射表 |
Exceptions |
存储方法抛出异常的类型 |
InnerClasses |
存储内部类的信息 |
EnclosingMethod |
存储该类所在的外围类方法的信息 |
Synthetic |
标识该类、字段或方法为编译器自动生成的 |
Signature |
存储泛型信息 |
SourceFile |
存储源文件的名称 |
SourceDebugExtension |
存储源文件的调试信息 |
LineNumberTable |
存储方法的行号信息 |
LocalVariableTable |
存储方法的局部变量信息 |
LocalVariableTypeTable |
存储方法的局部变量类型信息 |
Deprecated |
标识已经过时的类、字段或方法 |
RuntimeVisibleAnnotations |
存储可见的注解信息 |
RuntimeInvisibleAnnotations |
存储不可见的注解信息 |
RuntimeVisibleParameterAnnotations |
存储可见的参数注解信息 |
RuntimeInvisibleParameterAnnotations |
存储不可见的参数注解信息 |
AnnotationDefault |
存储注解的默认值 |
MethodParameters |
存储方法参数信息 |
Module |
存储模块的信息 |
ModulePackages |
存储模块的包信息 |
ModuleMainClass |
存储模块的main类信息 |
下面分别对其中的几种属性进行介绍。
Code属性
Code
属性用于存储方法的字节码。该属性中包含了以下信息:
max_stack
:操作数栈最大深度。max_locals
:局部变量表长度。code
:存储实际的字节码信息。exception_table
:存储方法抛出的异常类型和异常处理器的信息。attributes
:存储该属性的附加信息。
下面是一个Code属性的示例:
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
Exceptions属性
Exceptions
属性用于记录方法抛出的异常类型。该属性包含一个数组,存储所有可能抛出的异常类的常量池索引。
下面是一个Exceptions属性的示例:
Exceptions_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 number_of_exceptions;
u2 exception_index_table[number_of_exceptions];
}
其中,exception_index_table
数组中的每个元素都是一个常量池索引,表示一个可能抛出的异常类型。
小结
本篇攻略详细介绍了Java Class文件格式中的属性表集合。除了上述两种属性外,还有其他的属性,作者鼓励Java开发者们深入学习。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java class文件格式之属性详解_动力节点java学院整理 - Python技术站