42-Java字节码方法表与属性表深度剖析

Java字节码方法表与属性表深度剖析

  • 方法的个数:
    • 在这里插入图片描述
  • 方法表:
    • 方法表结构:
      • methods_count:u2
        -在这里插入图片描述
    • 在这里插入图片描述
    • 每一个方法的属性都是一个attribute_info类型的结构(下对对应对应上图的绿框圈起来的!)
      • 在这里插入图片描述
    • 方法的属性结构
      • JVM预定义了部分attribute,但是编译器自己也可以实现自己的attribute写入class文件,供运行时使用。
      • 不同的attribute通过attribute_name_index来区分。
  • Code结构
    • Code attribute的作用是保存该方法的结构,如所对应的字节码:
      在这里插入图片描述

    • 对上图的参数进行说明:

      • attribute_length表示attribute所包含的字节数,不包含attribute_name_index和attribute_length字段。
      • max_stack表示这个方法运行的任何时刻所能达到的操作数栈的最大深度。
      • max_locals表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。
      • code_length表示该方法所包含的字节码的字节数以及具体的指令码。具体字节码即是该方法被调用时,虚拟机所执行的字节码。
      • exception_table:这里存放的是处理异常的信息。
      • 每一个exception_table表项由start_pc,end_pc,hander_pc,catch_type组成。
        • start_pc和end_pc表示在code数组中的从start_pc到end_pc处(包含start_pc,不包含end_pc)的指令抛出的异常会由这个表项来处理;
        • hander_pc表示处理异常的代码的开始处;
        • catch_type表示会被处理的异常类型,它指向常量池里的一个[具体的]异常类。当catch_type为0时,表示处理所有的异常。
  • 方法的附加属性

    • LineNumberTable:这个属性用来表示code数组中的字节码和Java代码行数之间的关系。这个属性可以用来在调试的时候定位代码的行数。

    • 在这里插入图片描述

    • 临时变量:LocalVariableTable
      在这里插入图片描述