JVM的五个 invoke 指令详解

2024-08-24 08:28

本文主要是介绍JVM的五个 invoke 指令详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 概述
  • 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 的工作原理非常重要。

这篇关于JVM的五个 invoke 指令详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101954

相关文章

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

springboot将lib和jar分离的操作方法

《springboot将lib和jar分离的操作方法》本文介绍了如何通过优化pom.xml配置来减小SpringBoot项目的jar包大小,主要通过使用spring-boot-maven-plugin... 遇到一个问题,就是每次maven package或者maven install后target中的ja

Java中八大包装类举例详解(通俗易懂)

《Java中八大包装类举例详解(通俗易懂)》:本文主要介绍Java中的包装类,包括它们的作用、特点、用途以及如何进行装箱和拆箱,包装类还提供了许多实用方法,如转换、获取基本类型值、比较和类型检测,... 目录一、包装类(Wrapper Class)1、简要介绍2、包装类特点3、包装类用途二、装箱和拆箱1、装

如何利用Java获取当天的开始和结束时间

《如何利用Java获取当天的开始和结束时间》:本文主要介绍如何使用Java8的LocalDate和LocalDateTime类获取指定日期的开始和结束时间,展示了如何通过这些类进行日期和时间的处... 目录前言1. Java日期时间API概述2. 获取当天的开始和结束时间代码解析运行结果3. 总结前言在J

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH