[Golang实现JVM第五篇]静态方法调用的实现

一直以来又长又臭的调用链简直就是Java语言的标志性特色,方法调用可谓是Java世界里表达一切逻辑的基石。现在我们终于具备了实现它的基础。

JVM中的5条方法调用指令

在JVM中触发方法调用的指令有5条,分别是:

  • invokestatic

调用静态方法

  • invokespecial

调用构造方法

  • invokeinterface

调用接口方法

  • invokevirtual

调用对象方法

  • invokedynamic

jdk1.7中引入,给动态语言预留的调用指令。指令的第一个参数不再是代表方法符号引用的CONSTANT_Methodref_info常量,而是变为JDK 1.7新加入的CONSTANT_InvokeDynamic_info常量



invokestatic指令的实现

这里面最简单的就是invokestatic静态方法调用指令了,因为静态方法不需要创建对象,属于类。这条指令后面紧跟着两个字节,表示常量池中方法引用常量的下标:

invokestatic byte1 byte2

这样的话我们就可以从常量池中找到CONSTANT_Methodref_info常量,结构如下:

// 方法引用常量
type MethodRefConstInfo struct {
   
	Tag uint8
	ClassIndex uint16
	NameAndTypeIndex uint16
}

可以看到,里面记录了方法所在的类,和一个NameAndType常量的索引。其中NameAndType的结构如下:

type NameAndTypeConst struct {
   
	Tag uint8
	NameIndex uint16
	DescIndex uint16
}

其中NameIndex又是一个下标,指向的是常量池中的UTF8属性,表示方法的简单名,例如sayHello

DescIndex

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值