JVM的五个 invoke 指令详解

server/2024/10/9 17:27:49/

文章目录

  • 概述
  • invoke 指令概览
    • 1. invokespecial
    • 2. invokevirtual
    • 3. invokestatic
    • 4. invokeinterface
    • 5. invokedynamic
  • 总结

概述

Java 虚拟机 (JVM) 是 Java 语言的核心组件之一,负责执行 Java 字节码。在 JVM 中,invoke 指令用于执行方法调用。本文将详细介绍 JVM 设计的五个 invoke 指令,包括它们的作用和应用场景。

invoke 指令概览

JVM 设计了五个 invoke 指令,分别是:

  • invokespecial
  • invokevirtual
  • invokestatic
  • invokeinterface
  • invokedynamic

1. invokespecial

invokespecial 用于调用实例初始化方法(构造函数)、私有方法或父类方法。它不支持动态分派,而是根据编译期确定的方法进行调用。
示例代码:

package org.hbin.invoke;/*** @author Haley* @version 1.0* 2024/8/23*/
public class InvokeSpecialTest extends ParentObject{private void test() {// 调用构造方法new Object();new InvokeSpecialTest();// 调用私有方法privateMethod();// 调用父类方法super.doSomeThing();}private void privateMethod() {}
}class ParentObject {void doSomeThing() {}
}

在这里插入图片描述

2. invokevirtual

invokevirtual 用于调用实例方法,它支持动态分派,即在运行时根据实际对象类型来决定调用哪个方法。这是最常用的 invoke 指令之一。
示例代码:

package org.hbin.invoke;/*** @author Haley* @version 1.0* 2024/8/23*/
public class InvokeNormalMethodTest {public static void main(String[] args) {// 调用toStringnew Object().toString();InvokeNormalMethodTest instance = new InvokeNormalMethodTest();// 调用test1和test2instance.test1();instance.test2(1);}void test1() {}public int test2(int num) {return 0;}public int test2(int num1, int num2) {return 0;}
}

在这里插入图片描述

3. invokestatic

invokestatic 用于调用静态方法。它同样不支持动态分派,而是根据编译期确定的方法进行调用。
示例代码:

package org.hbin.invoke;/*** @author Haley* @version 1.0* 2024/8/23*/
public class InvokeStaticMethodTest {public static void main(String[] args) {add(1);add(Integer.valueOf(1));add(1, 2);}public static void add(int num) {}public static void add(Integer a) {}public static void add(int a, int b) {}
}

在这里插入图片描述

4. invokeinterface

invokeinterface 用于调用接口方法。它支持动态分派,并且支持查找实现类中的默认方法。
示例代码:

package org.hbin.invoke;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @author Haley* @version 1.0* 2024/8/23*/
public class InvokeInterfaceTest {public static void main(String[] args) {List<String> list = new ArrayList<>();Map<String, String> map = new HashMap<>();list.add("a");map.put("a", "1");}
}

在这里插入图片描述

5. invokedynamic

invokedynamic 是一个相对较新的指令,引入于 Java 7。它用于支持动态类型语言的调用约定,允许在运行时动态解析方法引用,并支持动态生成的类和方法。常用于lambda表达式、反射、CGLib、ASM或其他动态语言scala、Kotlin等场景。
示例代码:

package org.hbin.invoke;import java.util.ArrayList;
import java.util.List;/*** @author Haley* @version 1.0* 2024/8/23*/
public class InvokeDynamicTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.forEach(e -> {});list.stream().map(x -> x.trim());Runnable r = () -> {};}
}

在这里插入图片描述

总结

invoke 指令在 JVM 中扮演着至关重要的角色,它们负责执行方法调用。理解这些指令的作用和应用场景对于深入理解 Java 字节码和 JVM 的工作原理非常重要。


http://www.ppmy.cn/server/107281.html

相关文章

计算机视觉基础. 1 学习导论

1 .引言 学习的目的是从过去的经验中吸取教训&#xff0c;以解决未来的问题。通常&#xff0c;这涉及搜索解决问题过去实例的算法。然后&#xff0c;该算法可以应用于该问题的未来实例。 过去和未来不一定指日历日期&#xff1b;相反&#xff0c;它们指的是学习者之前看到的内…

计算机毕业设计选题推荐-剧本杀服务平台-剧本杀拼团管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

登录失败时刷新验证码

需求&#xff1a;当因为用户的输入存在错误&#xff0c;导致登录不成功时&#xff0c;需要重新换一张验证码 当点击登录按钮时&#xff0c;会向后端提交用户输入的用户名、密码、验证码等信息&#xff0c;经过后端的校验后&#xff0c;后端会返回code和message以及data等信息&…

word含有大量内容页数,如何快速截取部分内容

方法很简单&#xff0c;这里以wps为例&#xff0c;首先鼠标点到复制开始部分&#xff0c;之后滚动到结束部分&#xff0c;先按shift键&#xff0c;之后鼠标点击结束部分即可全选想要的内容。 好啦又水了一篇&#xff0c;希望能帮到有缘人。

Python 实时聊天室搭建:发布订阅频道API实战应用

大家好&#xff01;今天我要和大家分享一个超级酷炫的项目——使用Python搭建一个实时聊天室。在这个项目中&#xff0c;我们将深入探索一个强大的工具——发布订阅频道API&#xff0c;它将为我们的聊天室带来实时互动的魔力。 在这个信息爆炸的时代&#xff0c;实时通信已经成…

面试常问! transformer中dk的大小,以及为什么设成这样,维度,原文分析。

目录&#xff1a; 原文 &#xff1a;翻译&#xff1a;流程&#xff1a;原因&#xff1a; 原文(多头注意力部分) &#xff1a; 李沐b站论文精读 论文网盘下载&#xff1a;链接 提取码: vm3d 翻译&#xff1a; 在这项工作中&#xff0c;我们采用了 h8 个并行注意力层&#xff…

黑神话悟空用什么编程语言

《黑神话&#xff1a;悟空》作为一款备受瞩目的国产单机动作游戏&#xff0c;其背后的开发涉及了多种编程语言和技术。根据公开信息和游戏开发行业的普遍做法&#xff0c;可以推测该游戏主要使用了以下几种编程语言&#xff1a; C&#xff1a; 核心编程语言&#xff1a;作为《黑…

C# 使用OpenCV 类VideoCapture 和 Mat的正确方法

在做WPF桌面程序时候&#xff0c;要调用USB摄像头&#xff0c;因此接触了OpenCV , 遇到了各种坑&#xff0c;严重烧肝终于找到原因。 涉及的类包括VideoCapture , Mat. 问题1.内存泄漏 运行以下 代码片段&#xff0c;会发现内存持续飙升 for (int i 0; i < 1000; i){us…