天天看点

一把小刀,直插 class 文件的小心脏(4)

08、属性表

属性表是 class 文件中的最后一部分,通常出现在字段和方法中。

来看这样一段代码。

public class AttributeTest {

   public static final int DEFAULT_SIZE = 128;

}

只有一个常量 DEFAULT_SIZE,它属于字段中的一种,就是加了 final 的静态变量。先通过 jclasslib 看一下它当中一个很重要的属性——ConstantValue,用来表示静态变量的初始值。

一把小刀,直插 class 文件的小心脏(4)

Attribute name index 指向常量池中值为“ConstantValue”的常量。

Attribute length 的值为固定的 2,因为索引只占两个字节的大小。

Constant value index 指向常量池中具体的常量,如果常量类型为 int,指向的就是 CONSTANT_Integer_info。

我画了一副图,可以完整的表示字段的结构,包含属性表在内。

一把小刀,直插 class 文件的小心脏(4)
对应到 class 文件中的位置如下图所示。
一把小刀,直插 class 文件的小心脏(4)
来看下面这段代码。

public class MethodCode {
    public static void main(String[] args) {
        foo();
    }
    private static void foo() {
    }
}      

main 方法中调用了 foo 方法。通过 jclasslib 看一下它当中一个很重要的属性——Code, 方法的关键信息都存储在里面。

一把小刀,直插 class 文件的小心脏(4)

Attribute name index 指向常量池中值为“Code”的常量。

Attribute length 为属性值的长度大小。

bytecode 存储真正的字节码指令。

exception table 表示方法内部的异常信息。

maximum stack size 表示操作数栈的最大深度,方法执行的任意期间操作数栈深度都不会超过这个值。

maximum local variable 表示临时变量表的大小,注意,并不等于方法中所有临时变量的数量之和,当一个作用域结束,内部的临时变量占用的位置就会被替换掉。

code length 表示字节码指令的长度。

对应 class 文件中的位置如下图所示。

一把小刀,直插 class 文件的小心脏(4)

到此为止,class 文件的内部算是剖析得差不多了,希望能对大家有所帮助。第一次拿刀,手有点颤,如果哪里有不足的地方,欢迎大家在评论区毫不留情地指出来!