jvm方法的调用是如何实现的
作者:bin1.解析
根据调用类型的不同,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.多分派,就是根据多个去选择,例如一个不同对象和重载的不同方法。