一直以来又长又臭的调用链简直就是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