属性表集合

来源:互联网 发布:心理测试 软件 编辑:程序博客网 时间:2024/06/10 15:53

  属性表(attribute_info)在前面的讲解之中已经出现过数次,在Class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

  虚拟机规范定义的属性


Code属性

  Java程序方法体中的代码经过Javac编译器处理后,最终变为字节码指令存储在Code属性内。Code属性出现在方法表的属性集合之中,但并非所有的方法表都必须存在这个属性,譬如接口或者抽象类中的方法就不存在Code属性。
  

  1. attribute_name_index:指向常量池的索引,固定为Code
  2. max_stack:操作数栈深度的最大值
  3. max_locals:局部变量表所需的存储空间。max_locals的单位为Slot,小于32位的值(如int、byte、float)占用1一个Slot,double、long占用两个Slot。并不是方法中定义了多少个局部变量,就把这些局部变量所占Slot之和作为max_locals的值,当代码执行超过一个局部变量的作用域时,这个局部变量占用的Slot就可以被其他局部变量所使用,Javac编译器会根据变量的作用域来分配Slot给各个变量使用,然后计算max_locals的大小。
  4. code_length:字节码长度
  5. code:用于存储字节码指令的一系列字节流。每个指令都是一个u1类型数据,当虚拟机读取到code的一个字节码时,就可以找出这个字节码代表的是什么指令,并且可以知道这条指令后面是否需要跟随参数,以及参数应当如何理解。
  6. exception_table:异常表如下。如果当字节码在第start_pc行到第end_pc行之间(不含end_pc行)出现了类型为catch_type或者其子类的异常(catch_type为指向一个CONSTANT_Class_info型常量的引用),则转到第handler_pc行继续处理。当catch_type的值为0时,代表任意异常情况都需要转向到handler_pc行进行处理。

    异常表实际上是Java代码的一部分,编译器使用异常表而不是简单的跳转命令来实现Java异常及finally处理机制。

Exceptions属性

Exceptions属性:方法可能抛出的异常

LineNumberTable

Java源码行号与字节码行号之间的对应关系,当抛出异常时,行号就是从这里获取到的。

LocalVariableTable

描述栈帧中局部变量表中的变量与Java源码中定义的变量之间的关系。如果没有这个表,在调试期间无法获得参数值。

原创粉丝点击