JVM方法调用的本质

举报
程序员学长 发表于 2022/04/19 15:34:49 2022/04/19
【摘要】 大家好,我是程序员学长,专注分享大数据、算法、java、python等相关知识,欢迎和我一起交流学习。读前福利,最全pdf获取联系我今天我们来聊一下 JVM 中虚拟机栈的概念。 方法的调用在JVM中,将符合引用转换为调用方法的直接引用与方法的绑定机制相关。 链接静态链接:当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时,这种情况下将调用方法的符号引用...

大家好,我是程序员学长,专注分享大数据、算法、java、python等相关知识,欢迎和我一起交流学习。

读前福利,最全pdf获取

联系我

今天我们来聊一下 JVM 中虚拟机栈的概念。

方法的调用

在JVM中,将符合引用转换为调用方法的直接引用与方法的绑定机制相关。

链接

静态链接:

当一个字节码文件被装载进JVM内部时,如果被调用的目标方法在编译期可知,且运行期保持不变时,这种情况下将调用方法的符号引用转换为直接引用的过程称之为静态链接。

动态链接:

如果被调用的方法在编译期无法被确定下来,也就是说,只能够在程序运行期将调用方法的符号引用转换为直接引用,由于这种转换过程具备动态性,因此也被称为动态链接。

绑定机制

绑定是指一个字段、方法或者类在符号引用被替换为直接引用的过程。

早期绑定:

早期绑定就是指被调用的方法如果在编译期可知,且运行时保持不变,即可将这个方法与所属的类型进行绑定,这样一来,由于明确了被调用的目标方法究竟是哪一个,因此也就可以使用静态链接的方式将符合引用转换为直接引用。

晚期绑定:

如果被调用的方法在编译期无法被确定下来, 只能够在程序运行期根据实际的类型绑定相关的方法,这种绑定方式被称为晚期绑定。

虚方法与非虚方法

如果方法在编译期就确定了具体的调用版本,并且这个版本在运行时是不可变的,那么就称此方法为非虚方法。

静态方法、私有方法、final 方法、实例构造器、父类方法都是非虚方法,剩下的其它方法是虚方法。

JVM虚拟机提供的几个方法调用指令。

  • invokestatic:调用静态方法,解析阶段确定方法的版本
  • invokespecial:调用方法、私有及父类方法,解析阶段确定方法的版本
  • invokevirtual:调用所有的虚方法
  • invokeinterface:调用接口方法
  • invokedynamic:动态解析出需要调用的方法,然后执行

前四条指令固化在虚拟机内部,方法的调用执行不可人为干预,而 invokedynamic 指令则支持由用户确定方法的版本。

java语言中方法重写的本质
  1. 找到操作数栈顶第一个元素所执行的对象的实际类型,记做C
  2. 如果在类型C中找到与常量中描述符和简单名称都相符的方法,则进行访问权限校验,如果通过则返回这个方法的直接引用,查找过程结束。如果不通过,则返回 java.lang.IllegalAccessError 异常。
  3. 否则,按照继承关系从下往上依次对C的各个父类进行第二步的搜索和验证过程。
  4. 如果始终没有找到合适的方法,则抛出java.lang.AbstractMethodError异常。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。