java 方法 字节码_JVM Java字节码方法表与属性

方法表

1、methods_count

55021a7975e4e03c9b5a269bddb7ce33.png

method_info,前三个字段和field_info一样

c37585c0eb484cd065f407833b7c6afd.png

2、方法的属性结构

方法中的每个属性都是一个attribut_info结构

d0276f5373a4da2d8e657339008a485d.png

JVM定义了部分attribute,但是编译器自己也可以实现自己的attribute写入class文件里,供运行时使用。

不同的attribute通过attribute_name_index来区分。

JVM规范预定义的attribut

d1674d69e63085be96899c77a0d72cc5.png

3、Code结构

Code attribute 的作用是保存该方法的结构,如所对应的字节码

df9a341462a9bb8aa8d87b7b5ed5e250.png

attribute_length表示attribute所包含的字节数,不包含attribute_name_index和attribute_length字段

max_stack表示这个方法运行的任何时刻所能到达的操作数栈的最大深度。

max_locals 表示方法执行期间创建的局部变量的数目,包含用来表示传入的参数的局部变量。

code_length表示该方法所包含的字节码的字节数以及具体的指令吗

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

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代码行数之间的关系。这个属性可以用来在调试的时候定位代码执行的行数。

LineNumberTable的结构

b93167af5b93c74c96cfb7ca37618617.png

字节码查看工具

jclasslib

https://github.com/ingokegel/jclasslib

Idea上安装jclasslib插件

fa60a5fafff90794f469fdc1bb732fa4.png

插件安装好后,view里会多出两项

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值