JVM方法调用

Posted cathyqq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM方法调用相关的知识,希望对你有一定的参考价值。

JVM的静态绑定和动态绑定

JVM识别方法的关键在于类名、方法名及方法描述符(method descriptor)。方法描述符是由方法的参数类型和返回类型所构成。在同一个类中,如果同时出现多个类名方法名以及描述符都相同的方法,java虚拟机会在类的验证阶段报错。

java虚拟机与java语言不同,JVM不限制方法名和参数类型相同,返回类型不同的方法出现在同一个类中,对于调用这些方法的字节码来说,由于字节码所附带的方法描述符包含了返回类型,因此java虚拟机能够准确的识别目标方法。

java虚拟机的静态绑定:指的是在解析时便能够直接识别目标方法的情况。

java虚拟机的静态绑定:指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。

JVM提供了如下方法调用指令:

1、invokestatic: 调用静态方法。

2、invokespecial: 调用私有实例方法、构造器,以及使用super关键字调用父类的实例方法或构造器,和所有实现接口的默认方法。

3、invokevirtual: 调用虚方法即非私有的实例方法。

4、invokeinterface: 调用接口方法,在运行时再确定一个实现此接口的对象。

5、invokedynamic: 调用动态方法,在运行时动态解析出调用点限定符所引用的方法之后,调用该方法。

调用指令的符号引用

在编译过程中,我们并不知道目标方法的具体内存地址。因此,java编译器会暂时用符号应用来表示该目标方法。这一符号引用包括目标方法所在的类或接口的名字,以及目标方法的方法名或方法描述符。

符号应用存储在class文件的常量池中。根据目标方法是否为接口。这些引用可分为接口符号引用和非接口符号引用。在执行符号引用的字节码前,java虚拟机需要解析这些符号引用,并替换为实际引用。

注:此文为极客时间郑雨迪专栏,java虚拟机讲解及自己查资料的学习总结。郑雨迪《深入拆解Java虚拟机》很不错。

 

以上是关于JVM方法调用的主要内容,如果未能解决你的问题,请参考以下文章

JVM方法调用

Jvm(66),方法调用----动态分派调用

JVM理论:(三/4)方法调用

Jvm(65),方法调用----静态分派调用

JVM方法调用

JVM 方法调用之解析