08、属性表
属性表是 class 文件中的最后一部分,通常出现在字段和方法中。
来看这样一段代码。
public class AttributeTest {
public static final int DEFAULT_SIZE = 128;
}
只有一个常量 DEFAULT_SIZE,它属于字段中的一种,就是加了 final 的静态变量。先通过 jclasslib 看一下它当中一个很重要的属性——ConstantValue,用来表示静态变量的初始值。
Attribute name index 指向常量池中值为“ConstantValue”的常量。
Attribute length 的值为固定的 2,因为索引只占两个字节的大小。
Constant value index 指向常量池中具体的常量,如果常量类型为 int,指向的就是 CONSTANT_Integer_info。
我画了一副图,可以完整的表示字段的结构,包含属性表在内。
对应到 class 文件中的位置如下图所示。
来看下面这段代码。
public class MethodCode { public static void main(String[] args) { foo(); } private static void foo() { } }
main 方法中调用了 foo 方法。通过 jclasslib 看一下它当中一个很重要的属性——Code, 方法的关键信息都存储在里面。
Attribute name index 指向常量池中值为“Code”的常量。
Attribute length 为属性值的长度大小。
bytecode 存储真正的字节码指令。
exception table 表示方法内部的异常信息。
maximum stack size 表示操作数栈的最大深度,方法执行的任意期间操作数栈深度都不会超过这个值。
maximum local variable 表示临时变量表的大小,注意,并不等于方法中所有临时变量的数量之和,当一个作用域结束,内部的临时变量占用的位置就会被替换掉。
code length 表示字节码指令的长度。
对应 class 文件中的位置如下图所示。
到此为止,class 文件的内部算是剖析得差不多了,希望能对大家有所帮助。第一次拿刀,手有点颤,如果哪里有不足的地方,欢迎大家在评论区毫不留情地指出来!