JVM中相关方法的调用的指令
invokestatic
调用静态方法。
invokespecial
用于调用构造器方法<init>、私有方法、父类方法。
invokevirtual
用于调用类的所有虚方法。
invokeinterface
用于调用接口方法。
解析(resolution)与分派(dispatch)
解析
解析调用一定是个静态的过程,在编译期间就完全确定,在类装载的解析阶段就会把涉及的符号引用全部转变
为可确定的直接引用,不会延迟到运行期再去完成。
为可确定的直接引用,不会延迟到运行期再去完成。
下面我们看一段代码:
/**
* 方法静态解析演示
*
* @author cxt
*/
public class StaticResolution {
//静态方法
public static void say1() {
}
//final方法
public final void say2() {
}
//一般虚方法
public void say3() {
}
//重载say3
public void say3(int i) {
}
public static void main(String[] args) {
StaticResolution.say1();
StaticResolution sr = new StaticResolution();
sr.say2();
sr.say3();
sr.say3(10);
}
}
我们看一下字节码:
// class version 51.0 (51)
// access flags 0x21
public class StaticResolution {
// compiled from: StaticResolution.java
// access flags 0x1
public <init>() : void
L0
LINENUMBER 8 L0
ALOAD 0: this
INVOKESPECIAL Object.<init> () : void
RETURN
L1
LOCALVARIABLE this StaticResolution L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x9
public static say1() : void
L0
LINENUMBER 12 L0
RETURN
MAXSTACK = 0
MAXLOCALS = 0
// access flags 0x11
public final say2() : void
L0
LINENUMBER 17 L0
RETURN
L1
LOCALVARIABLE this StaticResolution L0 L1 0
MAXSTACK = 0
MAXLOCALS = 1
// access flags 0x1
public say3() : void
L0
LINENUMBER 22 L0
RETURN
L1
LOCALVARIABLE this StaticResolution L0 L1 0
MAXSTACK = 0
MAXLOCALS = 1
// access flags 0x1
public say3(int) : void
L0
LINENUMBER 26 L0
RETURN
L1
LOCALVARIABLE this StaticResolution L0 L1 0
LOCALVARIABLE i int