JVM虚拟机---(11)Class文件结构之方法表集合

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq1021979964/article/details/97129710

方法表集合

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.构造器方法案例

  1. 方法访问标志:0x0001,对应public。
  2. 方法名称:0x0004(对应十进制为4),指向常量池的第4,为init。
  3. 描述符索引:0x0005(对应十进制为5),指向常量池的第5,为()      V,表示方法无参数,无返回值。
  4. 属性计数器:0x0001(对应十进制为1),表示该方法表中有1个属性表。紧跟在后。
  5. 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
  6. 属性长度:0x0000 001D(对应十进制的29),表示后续29个字节是表示这个Code属性表的信息。
  7. 操作数栈的最大深度:0x0001(对应十进制的1),表示栈帧中操作数栈的最大深度是1。
  8. 局部变量表的最大容量:0x0001(对应十进制的1),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  9. 机器指令数目:0x0000 0005,表示后续的5个字节是机器指令集。
  10. 机器指令集:0x002A、0x00B7、0x0000、0x0001、0x00B1。
  11. 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
  12. Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
  13. Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。

LineNumberTable属性表的就不说了,直接过掉了。

4.自定义方法案例

  1. 方法访问标志:0x0001,对应public。
  2. 方法名称:0x0008(对应十进制为8),指向常量池的第8,为add。
  3. 描述符索引:0x0009(对应十进制为9),指向常量池的第9,为(II)I,表示方法参数有2个都是Int类型,返回值类型是Int。
  4. 属性计数器:0x0001(对应十进制为1),表示该方法表中有1个属性表。紧跟在后。
  5. 属性表名称索引:0x0006(对应十进制为6),指向常量池的第6,为Code,表示是Code类型的属性表。
  6. 属性长度:0x0000 001C(对应十进制的28),表示后续28个字节是表示这个Code属性表的信息。
  7. 操作数栈的最大深度:0x0002(对应十进制的2),表示栈帧中操作数栈的最大深度是2。
  8. 局部变量表的最大容量:0x0003(对应十进制的3),JVM调用该方法时,根据这个值设置栈帧中的局部变量表的大小。
  9. 机器指令数目:0x0000 0004,表示后续的4个字节是机器指令集。
  10. 机器指令集:0x001B、0x001C、0x0060、0x00AC。
  11. 显示异常表集合:0x0000,表示方法中没有需要处理的异常信息。
  12. Code属性表的属性表集合:0x0001,表示还有其他1个属性表集合。
  13. Code属性表集合名称:0x0007(对应十进制为7),指向常量池的LineNumberTable。

LineNumberTable属性表的就不说了,直接过掉了。

猜你喜欢

转载自blog.csdn.net/qq1021979964/article/details/97129710
今日推荐