这一次,彻底弄懂 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[推荐阅读
- 暴雪|暴雪新总裁刚上任3个月就离职,这一次,暴雪还有救吗
- 魔兽世界怀旧服|制霸全明星返场彻底凉了,上架第一天销量惨淡,玩家:有赛季皮肤足够了
- 明日方舟|明日方舟:六星近卫斯卡蒂现版本被完全撕卡 SP临光彻底让其失业
- 赛尔号|赛尔号衍生游戏精灵拟人形象 童年情怀彻底没了 但玩家有了新老婆
- 王者荣耀|王者荣耀:孙行者四款皮肤海报全部曝光,这一次倒是没让玩家失望
- 手机游戏|LOL手游传奇杯WT拿下冠军!意外惊现同阵容!版本答案彻底揭晓
- 极限国度|阴阳师川猿超鬼王活动攻略 活动过于阳间 爆肝删好友时代彻底终结
- 堡垒之夜|《堡垒之夜》国服关服,腾讯运营三年以彻底失败告终
- t1|T1上单鼠男账号被爆破,评论内容简单粗暴,一场BO5让他彻底成名
- 舰娘|碧蓝航线官方最大的强度笑话 未来可期的阿尔及利亚彻底卷没了