方法调用字节码命令

指令
invokeinterface调用接口方法,在运行时搜索一个实现了这个接口方法的类型
invokevirtual调用对象的实例方法,根据对象的实际类型进行分派
invokedynamic允许应用级别的代码来确定执行哪一个方法调用
invokevirtual

invokevirtual常用与动态分派,即调用子类重写的方法,这里不同于调用接口方法。动态分派使用了虚方法表实现,虚方法表中只会存放可以被重写的方法,而且通常不会包含接口方法。如果虚方法表中将父类的虚方法表中的内容放在最前面,新增加的方法在后面依次添加。那么,因为单继承的特点,一个方法在所有类的虚方法表中的位置是相同的,也就是说,父类的某个方法在虚方法表的第2项,那么它也一定在子类的虚方法表的第二项。另外,虚方法表是在运行时通过实际类型向上查找到实现类,然后将符号引用解析为直接引用。

invokeinterface

Java中可以实现多个接口,如果将接口方法放到虚方法表中,那么对于不同实现来说,它在虚方法表中的位置是不确定的。为了体现和invokevirtual指令以及虚方法表的区别,使用了invokeinterface指令以及接口方法表。例如,调用接口A的方法fun(),因为在类B和类C中fun()方法的索引位置不一样,所以需要在接口方法表中查找fun方法。

invokedynamic

无论是invokevirtual还是invokeinterface可以在运行时动态分派,但是分派的实现固定在JVM中,同时还会受到静态语言的特性的限制。因此为了支持动态语言引入invokedynamic指令,invokedynamic指令的思想是将方法分派的逻辑交给应用,nvokedynamic指令会通过Bootstrap Method创建一个CallSite然后将其链接到一个MethodHandle,最终执行的是MethodHandle指向的方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值