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

相关文章

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot整合Flowable实现工作流的详细流程

《SpringBoot整合Flowable实现工作流的详细流程》Flowable是一个使用Java编写的轻量级业务流程引擎,Flowable流程引擎可用于部署BPMN2.0流程定义,创建这些流程定义的... 目录1、流程引擎介绍2、创建项目3、画流程图4、开发接口4.1 Java 类梳理4.2 查看流程图4

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

HTML5 搜索框Search Box详解

《HTML5搜索框SearchBox详解》HTML5的搜索框是一个强大的工具,能够有效提升用户体验,通过结合自动补全功能和适当的样式,可以创建出既美观又实用的搜索界面,这篇文章给大家介绍HTML5... html5 搜索框(Search Box)详解搜索框是一个用于输入查询内容的控件,通常用于网站或应用程

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.