首页 > java > jvm方法的调用是如何实现的

jvm方法的调用是如何实现的

作者:bin

1.解析

根据调用类型的不同,java虚拟机通过以下5个命令去调用方法

·invokestatic。用于调用静态方法。
·invokesp ecial。用于调用实例构造器()方法、私有方法和父类中的方法。 ·invokevirt ual。用于调用所有的虚方法。
·invokeint erface。用于调用接口方法,会在运行时再确定一个实现该接口的对象。
·invokedy namic。先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法。前面4 条调用指令,分派逻辑都固化在Java虚拟机内部,而invokedy namic指令的分派逻辑是由用户设定的引 导方法来决定的。

使用如下代码演示;

public class Test extends TestB{
    public static void main(String[] args) {
        new Test().doTest(1);

    }
    public  String doTest(int date){
        while (date > 0){
            date = date + 1;
            System.out.println(date);
        }
        return date + "";
    }
}

我们使用javap -verbose查看字节码

javap -verbose Test.class

完整的文件内容可以参考

查看内容是使用invokespecial去调用的:

public static void main(java.lang.String[]);
...
8: invokevirtual #6                  // Method doTest:(I)Ljava/lang/String;
...

2.分派
1.静态分派,根据具体入参,选择具体的方法
2.动态分派,根据具体对象,调用具体对象的方法
3.单分派,方法的接收者与方法的参数统称为方法的宗量,单分派就是根据一个宗量去选择,例如不同对象,或者重载的不同方法。
4.多分派,就是根据多个去选择,例如一个不同对象和重载的不同方法。

您必须 [ 登录 ] 才能发表留言!