深入理解JVM-张龙-P49-P59

在这里插入图片描述
对于非静态的方法,总会有一个this参数
在这里插入图片描述
test()方法有4个局部参数,分别是this,is,serverSocket,ex。catch语句只会执行一条所以只有一个ex
在这里插入图片描述
下面来讲异常部分
在这里插入图片描述
在这里插入图片描述
这里的一行代码对应五行字节码
在这里插入图片描述
ExceptionTable
在这里插入图片描述
上面表格的第一个异常处理,当在0~25行代码执行时出现异常的时候,跳到37行去执行处理异常语句,由于为catch{}为空,所以直接执行finally语句。
在这里插入图片描述
每个异常处理的字节码后面都会跟着finally语句块,有多少catch,就会复制多少finally执行的字节码
在这里插入图片描述
行号表,linenumbertable
存储字节码和代码之间的对应关系
在这里插入图片描述
局部变量表,localvariabletable
这里只列出了3个,因为ex变量只有运行的时候才会知道是哪个exception
在这里插入图片描述
异常处理的第二种方式,使用throw来抛出异常
在这里插入图片描述
发现多了一个Exceptions属性
在这里插入图片描述
下面来讲栈帧,每个线程会有自己的栈帧,所以不需要考虑并发的情况
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
方法调用的五条指令
在这里插入图片描述
invokestatic方法
在这里插入图片描述
invokestatic、invokespecial
在这里插入图片描述
一个例子
在这里插入图片描述
在这里插入图片描述
一个例子,方法重写
在这里插入图片描述
在这里插入图片描述
在字节码里其实apple.test()调用的是fruit.test()
在这里插入图片描述
invokevirtual多态查找流程
1.找到操作数栈顶的第一个元素,查看它所引用的实际类型
2.在实际类型中查找是否有test()方法,且拥有访问权限
3.如果找到就将com/shengsiyuan/jvm/bytecode/Fruit.test的符号引用转换为对apple.test()的直接引用,即引用Apple类里的test方法。
4,.如果没有找到就沿着父类去找。最后实在没找到,抛出异常
在这里插入图片描述
在这里插入图片描述
可以看到即使是相同的符号引用如Fruit.test,在运行期也可以转换成不同的直接引用

下个例子
在这里插入图片描述
在这里插入图片描述
虚方法表中的每一项存储的是方法调用的入口地址
如果子类重写了父类的方法,在虚拟方法表中的索引号是与父类相同的
如果子类没有重写父类的某个方法,那么在方法表中会直接指向父类的这个方法的入口地址
在这里插入图片描述
编译执行和解释执行
在这里插入图片描述
在这里插入图片描述
结合例子进行讲解
在这里插入图片描述
stack=2,表示栈的深度为2,栈最多能够容纳两个元素,locals=6,表示最多有6个局部变量,args_size=1,表示参数的数量是1,即this

iconst_1即把数字1推送至操作数栈当中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
动态代理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
字节码总结

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值