jvm方法调用指令invokestatic,invokespecial,invokeinterface,invokevirutal分析

news2024/11/13 13:18:53

写在前面

本文来看下jvm方法调用相关的4个指令invokestatic,invokespecial,invokeinterface,invokevirutal。

1:如何来记

1.1:静态绑定和动态绑定

如果是在编译期就能确定要调用的方法,就叫做静态绑定,比如构造函数方法,静态方法,private方法。
如果是必须在运行期才能确定要调用的方法,就叫做动态绑定,比如基于接口的引用调用的方法。

我们可以首先按照静态绑定还是动态绑定来对一个方法调用进行分类,然后再根据具体情况判断其对应的指令什么:

  • 如果判定是静态绑定
如果是静态方法:则是invokestatic指令
如果不是静态方法:则是invokespecial指令,包括构造函数,private方法,super关键字的方法调用
  • 如果判定是动态绑定
如果引用是接口,则是invokeinterface指令
如果不是接口(类,抽象类),则是invokevirtual指令

这样是不是很好记了,接下来再看个例子。
首先定义一个接口和一个类:

package org.example;

public interface I1 {

    public void fn1();

    default void fn2() {}
}
package org.example;

public class B1 {

    void fn3(){
    }
}

再定义一个类实现接口,继承类:

package org.example;

public class S1 extends B1 implements I1 {

    public static void main(String[] args) {
        // 构造函数对应INVOKESPECIAL指令
        I1 t1 = new S1();
        // 实例私有方法对应INVOKESPECIAL指令
        ((S1)t1).privateFn();
        // 静态方法对应INVOKESTATIC
        sayHi();
        // 基于接口引用调用接口定义的抽象方法,对应INVOKEINTERFACE指令(动态绑定)
        t1.fn1();
        // 构造函数对应INVOKESPECIAL指令
        B1 b1 = new S1();
        // 基于接口引用调用接口定义的抽象方法,对应INVOKEVIRTUAL指令(动态绑定)
        b1.fn3();
    }

    public S1() {}

    // 实例私有方法,对应invokespecial
    private void privateFn() {
    }

    // 静态方法,对应invokestatic指令
    public static void sayHi() {
    }

    @Override
    public void fn1() {

    }
}

接着我们来使用bytecode outline插件来查看字节码:
在这里插入图片描述
具体可以对比来看下。

写在后面

参考文章列表

字节码编程ASM之idea插件asm bytecode outline的使用

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis RDB AOF持久化 主从集群同步原理

RDB RDB Redis数据备份文件 也被叫做Redis数据快照 简单来说就是 把内存中的所有数据记录到磁盘中 当Redis实例故障实例重启后从磁盘读取快照文件恢复数据 快照文件称为RDB文件 默认时保存在当前运行目录执行时机 执行save命令 127.0.0.1:6379> save OK 127.0.0.1:6379&g…

(002)两数相加

思路分析: 类似于一个大数加法,注意链表的边界和进位,同时还有注意存在两个链表长度不等,需要处理多出来的元素 代码实现: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNod…

PDF发票解析并将信息回填到前端(1)后端解析PDF

文章目录 参考文章技术栈需求解析发票类型 1. 最终项目结构1.1 说明 2. 相关代码2.1 导入相应的maven依赖2.2 实体类2.3 工具类2.4 三层架构controllerservicemapper 参考文章 参考文章 技术栈 SpringBootVue 需求 本文主要是实现提取发票中的部分内容,并实现自…

单调栈② | Java | LeetCode 接雨水 最大的矩形

42. 接雨水 暴力法 for循环遍历每一个柱子,内层for循环找到左边和右边比它高的柱子 时间复杂度 n^2 优化:添加一个预处理 定义一个数组,存放该柱子右边比他高的柱子是哪一个 再用一个数组,存放该柱子左边比他高的柱子是哪一个 …

html页面下载及多html文件合成单pdf方法

1,html页面下载 ~1,首先在edge中微软扩展商店搜索 “SingleFile”添加扩展 浏览器右上角点击扩展按钮 下拉菜单选择管理扩展 点击 获取 Microsoft Edge 扩展 进入微软商店搜索 “singlefile” 点击获取 点击浏览器右上角扩展按钮,…

IPv4 vs IPv6:了解这两大协议的关键差异

我发现,很多找代理IP的朋友在后台问我的问题都很相似!都被配置IP的最后一步:选择IPv4还是IPv6?给难住了。昨晚我一晚没睡,终于整理出对IPv4和IPv6的对比总结,从概念阐述到特点对比,再解答IPv6总…

利用 IP 地址进行社交工程攻击?

社交工程攻击是网络安全的主要威胁之一。现在攻击者不再仅依赖技术漏洞,而是想利用人性的弱点来获取有价值的信息或实现非法目的。 IP 地址在社交工程攻击中的作用 定位和伪装获取目标用户的 IP 地址,大致确定目标用户地理位置,然后伪装成当…

spring原理(自学第六天)

Aware 接口及 InitializingBean 接口 今天将会学到Aware 接口及 InitializingBean 接口 我们可以先了解他们的作用: 1. Aware 接口用于注入一些与容器相关信息, 例如 a. BeanNameAware 注入 bean 的名字 b. BeanFactoryAware 注入…

解锁LLM应用潜能:提示工程的39种方法与应用全解析!

大型语言模型(LLMs)在许多不同的自然语言处理(NLP)任务上表现出了显著的性能。提示工程在提升LLMs已有能力方面发挥着关键作用,使其在各种NLP任务上取得了显著的性能提升。提示工程需要编写自然语言指令,即…

QT 应用程序输出中文乱码

一 ,选择文本编码 1. 点击编辑再点击Select Encoding选择编码 2 .在弹出的窗口,选择UTF-8再点击按编码保存即可 3. 重新编译,可以发现中文乱码问题解决

Spring源码解析(28)之AOP的核心对象创建过程总结

一、总结图 二、总结 以上是对AOP核心对象创建的一个总结,接下来我们分点介绍我们自从定义了aop.xml之后,spring在启动的时候是怎么创建了这些核心对象的。 启动spring容器之后,其实核心是是refresh方法,refresh的13个核心方法&…

CTFHub——XSS——反射型

1、反射型: 发现为表单式,猜测哪个可能存在注入漏洞,分别做测试注入发现name框存在xss漏洞 输入发现有回显但不是对方cookie,参考wp发现要用xss线上平台 将xss平台测试语句注入,将得到的url编码地址填入url框&#xf…

Lineage凌骥电源模块维修CP2725AC54Z

Lineage Power交换机电源常见维修型号有: CAR2024FPZ0-1A、CP2725AC54TEZ、AXA005A0X-SRZ、APXW005A0X3-SRZ、AXA016A0X3-SRZ、EP3000AC48TE、CP3000AC54TEZ、 CP3000AC54TEZ、QBDW033A0B641Z及EP4848系列直流电源维修等。 凌骥电源维修实践中,有许多开关…

【OpenCV C++20 学习笔记】击中击不中(Hit-or-Miss)

击中击不中 Hit-or-Miss 原理代码实现 原理 形态学操作对图片的处理是基于图片的形状的。形态学操作将一个或多个结构元素(structuring elements),即卷积核,应用到图片上从而获得计算结果。最基本的两个形态学操作就是腐蚀(erosion)和膨胀(dilation)。这…

7 时间序列单特征:多输入->多输出(LSTM/GRU/TCN)

今天看到关于时间序列预测知识点,竟然要收费!本着开源第一的思想,自己也找到相关的代码尝试一下写几个通用的模版。 模型想要 输入:Input (input_size, hidden_size),其中:input_size time_stemp,因为是单个变量因此…

从实现第一个ArkTs应用开始入门

前言 新建了个鸿蒙学习项目,后续持续学习会把代码放到这里来:鸿蒙项目仓库学习实践版 基本概念 从HarmonyOS NEXT Developer Preview1(API 11)版本开始,HarmonyOS SDK以Kit维度提供了六大领域的开放能力, 包括: 应用…

800G FR4解决方案:高速数据传输的理想选择

随着业务规模的扩大,数据中心面临着越来越多的数据处理需求。虚拟化、物联网(IoT)和云计算等数据密集型应用推动了数据中心流量的不断增长,从而提升了对大容量800G解决方案的市场需求。因此,新建800G数据中心&#xff…

marker - PDF 转 markdown

文章目录 一、关于 marker特点它是如何工作的例子性能商业用途托管API限制 二、安装Optional: OCRMyPDF 三、用法1、配置转换单个文件转换多个文件在多个GPU上转换多个文件 三、故障排除四、有用的设置五、基准测试速度精度吞吐量 六、运行自己的基准测试七、感谢 一、关于 mar…

C++初学(9)

9.1、结构简介 虽然数组能够和存储多个元素,但所有元素必须相同,也就是说,同一个数组不能既存放int类型也存放float类型,而C的结构可以满足要求。结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的…

防御笔记第九天(持续更新)

注意:攻击可能只是一个点,而防御需要全方面进行。 1.IAE引擎 2.DPI DPI ----深度包检测 --- 针对完整的数据包,进行内容的识别和检测 3.基于特征字的检测技术 4,基于应用网关的检测技术 基于应用网关的检测技术 --- 有些应用控…