版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
方法表集合
Class文件对方法的描述与对字段的描述几乎一致,方法表的结构和字段表的结构一样,依次包括了访问标志(access_flags)、名称索引(name_index)、描述符索引(description_index)、属性表集合(attribute)几项。
1.方法表结构(method_info)组成
访问标志(access_flags)、名称索引(name_index)、描述索引(descriptor_index)、属性表集合
2.案例
public class TestMethod {
public int add(int a,int b) {
return a+b;
}
}
在字段表集合之后的是方法计数器,接着就到方法区。我们在上面只是定义了一个方法add,但是里面显示有两个方法,因为是无参构造器,那么先说一下构造器
方法计数器:0x0002(对应十进制为2),方法有2个。
3.构造器方法案例
- 方法访问标志:0x0001,对应public。
- 方法名称:0x0004(对应十进制为4),指向常量池的第4,为init。
- 描述符索引:0x0005(对应十进制为5),指向常量池的第5,为() V,表示方法无参数,无返回值。
- 属性计数器:0x0001(对应十进制为1),表示该方法表中有1个属性表。紧跟在后。
- 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
- 属性长度:0x0000 001D(对应十进制的29),表示后续29个字节是表示这个Code属性表的信息。
- 操作数栈的最大深度:0x0001(对应十进制的1),表示栈帧中操作数栈的最大深度是1。
- 局部变量表的最大容量:0x0001(对应十进制的1),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
- 机器指令数目:0x0000 0005,表示后续的5个字节是机器指令集。
- 机器指令集:0x002A、0x00B7、0x0000、0x0001、0x00B1。
- 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
- Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
- Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。
LineNumberTable属性表的就不说了,直接过掉了。
4.自定义方法案例
- 方法访问标志:0x0001,对应public。
- 方法名称:0x0008(对应十进制为8),指向常量池的第8,为add。
- 描述符索引:0x0009(对应十进制为9),指向常量池的第9,为(II)I,表示方法参数有2个都是Int类型,返回值类型是Int。
- 属性计数器:0x0001(对应十进制为1),表示该方法表中有1个属性表。紧跟在后。
- 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
- 属性长度:0x0000 001C(对应十进制的28),表示后续28个字节是表示这个Code属性表的信息。
- 操作数栈的最大深度:0x0002(对应十进制的2),表示栈帧中操作数栈的最大深度是2。
- 局部变量表的最大容量:0x0003(对应十进制的3),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
- 机器指令数目:0x0000 0004,表示后续的4个字节是机器指令集。
- 机器指令集:0x001B、0x001C、0x0060、0x00AC。
- 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
- Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
- Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。
LineNumberTable属性表的就不说了,直接过掉了。