这一次,彻底弄懂 Java 字节码文件!(16)



→ ...

具体字节码即是该方法被调用时 , 虚拟机所执行的字节码 。

exception_table , 这里存放的是处理异常的信息 。 每个exception_table表项由start_pc , end_pc , handler_pc , catch_type组成 。 start_pc和end_pc表示在code数组中的从start_pc到end_pc处(包含start_pc , 不包含end_pc)的指令抛出的异常会由这个表项来处理 。 handler_pc表示处理异常的代码的开始处 。 catch_type表示会被处理的异常类型 , 它指向常量池里的一个异常类 。 当catch_type为0时 , 表示处理所有的异常 。 附加属性 LineNumberTable:这个属性用来表示code数组中的字节码和Java代码行数之间的关系 。 这个属性可以用来在调试的时候定位代码的执行行数 。 LocalVariableTable:局部变量表 , 当前类中只有唯一的局部变量 , 而这个局部变量就是this当前对象 。 局部变量表属性类似于行号表属性 。 请注意: Java源代码角度:Java类中的实例方法中可以直接使用this 。 Java字节码角度:Java类中的非静态方法 , 即实例方法中的这个this实际是通过编译器隐示的作为方法的第一个参数传递进来(有点类似于Python中的方法 , 其方法中的第一个参数都会传递一个self变量 , 表示当前对象本身) 。 这样使得每一个实例方法内部都可以很顺利的访问this 。 换句话说针对类的实例方法它至少会有一个LocalVariable局部变量 , 这个变量就是this 。 4.7 字段/方法描述符 在JVM规范中 , 每个变量/字段都有描述信息 , 描述信息主要的作用是描述字段的数据类型、方法的参数列表(包括数量、类型与顺序)与返回值 。 根据描述符规则 , 基本数据类型和代表无返回值的void类型都用一个大写字符来表示 , 对象类型则使用字符L加对象的全限定名称来表示 。 为了压缩字节码文件的体积 , 对于基本数据类型 , JVM都只使用一个大写字母来表示 , 如下所示: B - byte , C - char , D - double , F - float , I - int , J - long , S - short , Z - boolean , V - void , L - 对象类型 , 如Ljava/lang/String; 数组类型:针对数组类型来说 , 每一个维度使用一个前置的[来表示 , 如: int[

推荐阅读