首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java虚拟机--方法调用

方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),占式还不涉及方法内部的具体运行过程。...这种解析能成立的条件是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期间是不可改变的。这类方法的调用称为解析。...分派: 1、静态分派 所有依赖静态类型来定位方法执行版本的分派动作称为静态分派。静态分派的典型应用是方法重载。静态分派发生在编译阶段,因此静态分派的动作实际上不是由虚拟机来执行的。 ?...再看看运行阶段的虚拟机选择,也就是动态分派过程。...在执行Son.choose(Black)时,由于编译期已经决定目标方法的参数是Black,虚拟机现在不关心参数的类型,只关注此方法的接收者的实际类型,这里实际类型是Son。

53450

详解java虚拟机方法调用

方法调用 方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。...,并且这个方法的调用版本在运行期是不可改变的。...与之相对应的是,在Java虚拟机里面提供了5条方法调用字节码指令,分别如下。 invokestatic:调用静态方法。...invokespecial:调用实例构造器<init>方法、 私有方法和父类方法。 invokevirtual:调用所有的虚方法。...invokedynamic:先在运行时动态解析出调用点限定符所引用的方法,然后再执行该方法,在此之前的4条调用指令,分派逻辑是固化在Java虚拟机内部的,而invokedynamic指令的分派逻辑是由用户所设定的引导方法决定的

36220
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java方法调用(虚拟机字节码执行引擎)

    JAVA方法调用属于虚拟机字节码执行引擎的一部分,执行引擎,可以简单的理解为它用来接收输入的Class文件,按照字节码进行处理程序,然后输出执行结果。...我们在如何找个对象中已经讲述了关于方法调用的指令,那么今天我们就看一下方法调用的时候虚拟机引擎会做哪些事。 1....方法调用 由于Java语言的多态性质(重写、重载),因此我们的方法调用需要确认需要调用哪个方法。这里不牵涉方法的执行。 2....所有基于静态类型来确定方法调用版本的方式都属于静态分派。静态分派发生在编译阶段,因此并不是由虚拟机执行的,编译器在确定方法版本的时候会选取于一个最合适的版本。...本期虚拟机层面的Java方法调用介绍到这,我们下期再见!!!

    35720

    Java虚拟机学习:方法调用的字节码指令

    我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种:  1. invokespecial:调用私有实例方法; 2. invokestatic...:调用静态方法; 3. invokevirtual:调用实例方法; 4. invokeinterface:调用接口方法; 5.  ...invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出。...invokespecial指令来实现的; invokestatic:调用静态方法 getValue()方法中,调用了静态方法String.valueOf(),反编译结果如下所示,注意编号为6的那一行:...; 以上就是五种方法调用的字节码指令的简单介绍,实际上每个指令背后都对应着更复杂的调用和操作,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习。

    49200

    Java虚拟机学习:方法调用的字节码指令

    我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: 1. invokespecial:调用私有实例方法; 2. invokestatic:...调用静态方法; 3. invokevirtual:调用实例方法; 4. invokeinterface:调用接口方法; 5. invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出...invokespecial指令来实现的; invokestatic:调用静态方法 getValue()方法中,调用了静态方法String.valueOf(),反编译结果如下所示,注意编号为6的那一行:...invokestatic指令来实现的; invokevirtual:调用实例方法 在main()方法中,调用了t.getValue(1,2)方法,反编译结果如下所示,注意编号为13的那一行: public...; 以上就是五种方法调用的字节码指令的简单介绍,实际上每个指令背后都对应着更复杂的调用和操作,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习。

    1.2K00

    Java虚拟机学习:方法调用的字节码指令

    我们在写java程序的时候会进行各种方法调用,虚拟机在执行这些调用的时候会用到不同的字节码指令,共有如下五种: 1. invokespecial:调用私有实例方法; 2. invokestatic...:调用静态方法; 3. invokevirtual:调用实例方法; 4. invokeinterface:调用接口方法; 5....invokedynamic:调用动态方法; 这里我们通过一个实例将这些方法调用的字节码指令逐个列出。...invokespecial指令来实现的; invokestatic:调用静态方法 getValue()方法中,调用了静态方法String.valueOf(),反编译结果如下所示,注意编号为6的那一行:...是个MethodHandler的引用,指向了用户实现的lambda方法; 以上就是五种方法调用的字节码指令的简单介绍,实际上每个指令背后都对应着更复杂的调用和操作,有兴趣的读者可以通过虚拟机相关的书籍和资料继续深入学习

    747100

    Java 虚拟机-JVM是如何执行方法调用的?(上)

    然而,Java 编译器直接将我的方法调用识别为调用第二个方法,这究竟是为什么呢? 带着这个问题,我们来看一看 Java 虚拟机是怎么识别目标方法的。...重写调用也是如此:它会根据调用者的动态类型,来选取实际的目标方法。 JVM 的静态绑定和动态绑定 接下来,我们来看看 Java 虚拟机是怎么识别方法的。...这个说法在 Java 虚拟机语境下并非完全正确。这是因为某个类中的重载方法可能被它的子类所重写,因此 Java 编译器会将所有对非私有实例方法的调用编译为需要动态绑定的类型。...确切地说,Java 虚拟机中的静态绑定指的是在解析时便能够直接识别目标方法的情况,而动态绑定则指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。...在 Java 虚拟机中,静态绑定指的是在解析时便能够直接识别目标方法的情况,而动态绑定则指的是需要在运行过程中根据调用者的动态类型来识别目标方法的情况。

    1.5K71

    Java 虚拟机:JVM是如何执行方法调用的?(下)

    至于第二个错误,我们今天便来聊一聊 Java 虚拟机中虚方法调用的具体实现。 首先,我们来看一个模拟出国边检的小例子。...这两种指令,均属于 Java 虚拟机中的虚方法调用。 在绝大多数情况下,Java 虚拟机需要根据调用者的动态类型,来确定虚方法调用的目标方法。这个过程我们称之为动态绑定。...在 Java 虚拟机中,静态绑定包括用于调用静态方法的 invokestatic 指令,和用于调用构造器、私有实例方法以及超类非私有实例方法的 invokespecial 指令。...如果虚方法调用指向一个标记为 final 的方法,那么 Java 虚拟机也可以静态绑定该虚方法调用的目标方法。 Java 虚拟机中采取了一种用空间换取时间的策略来实现动态绑定。...否则,Java 虚拟机将采用动态绑定,在运行过程中根据调用者的动态类型,来决定具体的目标方法。 Java 虚拟机的动态绑定是通过方法表这一数据结构来实现的。

    1.2K21

    Visual Studio调用已配置好的C++库的方法

    本文介绍在Visual Studio软件中调用C++各种配置、编译完毕的第三方库的方法。   ...本文就以之前的文章C++矩阵库Armadillo在Visual Studio中的配置中介绍的矩阵运算库Armadillo为例,介绍安装完某一个第三方库后,如何在Visual Studio软件新的项目中调用这个库...首先,按照文章C++矩阵库Armadillo在Visual Studio中的配置中提到的方法,我们配置、编译好这个矩阵运算库Armadillo。...随后,在我们配置这一库时所创立的项目中,是可以在源文件中调用该库的;如下图所示,我们在这一个项目的源文件中输入一段调用该库的代码,其在引入时是不会报错的,且代码也可以正常运行。...依据同样的方法,将我们配置Armadillo库时得到的lib_win64文件夹导入其中。

    36420

    在C++中反射调用.NET(一) 反射调用第一个.NET类的方法

    为什么要在C++中调用.NET 一般情况下,我们常常会在.NET程序中调用C/C++的程序,使用P/Invoke方式进行调用,在编写代码代码的时候,首先要导入DLL文件,然后在根据C/C++的头文件编写特殊的...extern int Multiply(int factorA, int factorB); 详细的过程,可以参考之前我这篇文章:《C#调用C和C++函数的一点区别》 有时候,我们也会有在C++中调用...注意,本文说的C++反射调用,不是对C++自身进行封装的反射功能,而是在C++/CLI代码中反射调用.NET代码,原理上跟你在.NET应用中反射调用另外一个.NET的程序集一个道理。...在C++/CLI中使用反射 反射调用第一个.NET类的方法 下面的方法,将会反射调用 User类的一个最简单的方法 : public int GetUserID(string IdString){} 该方法只有一个一个参数和一个简单的返回值...有了这2个简单的方法,我们来看看如何调用这个.NET方法“代理类”: NetLibProxy::UserProxy^ proxy = gcnew NetLibProxy::UserProxy("

    3.2K100

    C++ 解引用与函数基础:内存地址、调用方法及声明

    C++ 解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符 & 一起使用)。...printMessage 的函数,该函数接收一个字符串参数并将其打印到控制台:void printMessage(string message) { cout 调用要调用函数...输入参数:函数从调用者接收数据。输出参数:函数将数据返回给调用者。输入输出参数:函数既可以接收数据又可以返回数据。在 C++ 中,函数参数默认是输入参数。...函数返回值函数可以返回一个值给调用者。...总结函数是 C++ 中重要的编程概念,它们可以提高代码的可重用性、可读性和可维护性。通过理解函数的声明、定义、调用和参数传递等概念,您可以编写更简洁、更有效的 C++ 程序。

    14300

    微软Azure Windows虚拟机用户遭到了全球性的故障

    运行非Windows虚拟机或现有部署环境的用户并未受到影响。...据微软的状态页面显示,停运“最早”发生在今天UTC(协调世界时)05点12分,目前尚未修复,微软表示它正在“采取缓解方法”,我们确信这对恼怒的用户们来说有所安慰。...非Windows虚拟机和运行中的现有Windows虚拟机应该不会受到该问题的影响。依赖Windows虚拟机的服务在创建资源时也可能会遇到故障。” 从美洲、欧洲、中东及非洲到亚太地区,服务到处受到影响。...截至UTC 11点03分,微软表示它已“查明在服务管理操作期间进行的调用出故障,原因是所需的工件版本在查询期间未按预期返回。” “故障表明,无法找到一个所需的扩展件。...我们目前正在实施一种缓解方法,以便强行更新该扩展件,并且在部署缓解方法的地方看到了恢复的迹象。随着缓解方法在各地区得到部署,我们预计会逐渐恢复正常。会在60分钟内或视情形发布下一次更新信息。”

    1.8K10

    C++ Thrift服务端记录调用者IP和被调接口方法

    Apache开源的Thrift(http://thrift.apache.org)有着广泛的使用,有时候需要知道谁调用了指定的函数,比如在下线一起老的接口之前,需要确保对这些老接口的访问已全部迁移到新口...本文对这个做一个详细的介绍,过程中使用到了开源的C++ Thrift服务端的辅助类CThriftServerHelper(对应的客户端辅助类为CThriftClientHelper),源代码网址为:...= NULL) { // TSocket::getPeerAddress返回的是IP地址, // 如果调用TSocket::getPeerHost(),则返回的可能是IP对应的hostname MYLOG_DEBUG...Called from %s:%d\n", socket->getPeerAddress().c_str(), socket->getPeerPort()); } #endif } // 参数fn_name为被调用接口名..., // 直到调用_thrift_server.stop()停止Thrift服务。

    1.3K20

    【C++】构造函数分类 ③ ( 调用有参构造函数的方法 | 括号法 | 等号法 )

    堆内存 中创建对象 的 两种情况 ; 本篇博客中 , 继续分析 , 栈内存中调用 有参构造函数的 两种方法 : 括号法 等号法 C++ 类成员变量为 : public: int m_age; char...; // 有参构造函数 Student(int age, const char* name) { // 方法体 省略 cout 调用有参构造函数" << endl; } 不推荐的用法...: 通过 Student(18, “Tom”) 方法 , 手动调用有参的构造函数 , 上述代码会产生一个匿名的 Student 实例对象 , 然后再将该 匿名对象 赋值给 栈内存中的 Student...(18, "Tom"); 推荐的用法 : 在栈内存中创建 类的 实例对象 , 推荐使用 下面的方法 , 在声明的 栈内存变量名称后 , 直接使用括号 , 并传入构造函数的参数 ; // 使用 括号法...有参构造函数 , 并将创建的 实例对象 赋值给 s5 变量 , 这是 C++ 对 = 等号运算符的增强 ; // 使用 等号法 调用 有一个参数的 有参构造函数 // C++ 对等号进行了功能增强

    22940

    直连Colab,支持20种编程语言:谷歌版ChatGPT代码水平反杀了?

    谷歌表示,Bard 现在能使用 20 种编程语言,包括 C++、Go、Java、Javascript、Python 和 Typescript 等等,还能帮助用户 debug 和解释代码、优化代码。...如果 Bard 生成的代码未按预期运行,只需告诉 Bard:「this code didn’t work, please fix it(此代码无效,请修复)」,Bard 就可以帮助用户进行调试。...谷歌表示,Bard 仍处于早期实验阶段,有时可能会提供不准确、误导或虚假的信息,也可能会生成无法产生预期输出的代码,或者生成不是最优的 / 不完整的代码。...问 Bard「你能帮我实现一个基本的 RNN 并在虚拟文本数据上测试它吗?」然后直接把生成的代码导出到 Google Colab 上。代码的一部分不起作用。

    1.6K30

    【C++ 语言】面向对象 ( 继承 | 重写 | 子类调用父类方法 | 静态多态 | 动态多态 | 虚函数 | 纯虚函数 )

    继承表示 : C++ 中继承可以使用 “:” 符号 , 格式为 "class 子类名称 : 父类名称{};" //父类 class Parent{ }; //子类 //继承父类 Parent class...C++ 多继承 : Java 中只能进行单继承 , 但是在 C++ 中是可以继承多个父类的 ; 在多继承时 , 使用 “,” 将多个父类分隔即可 ; 5....C++ 多继承作用域 : 多继承中 , 每个父类的作用域都可以单独指定; #pragma once //父类 class Parent{ public: void parent_method()...外部通过子类调用父类方法 : 如果调用的方法在子类中没有重写 , 那么调用的就是父类的方法 ; //在栈内存中创建一个 Child 对象, 并调用其重写的父类的方法 Child child; //...代码执行结果 : 调用子类重写后的方法 , 其调用的是子类的方法 , 如果调用子类没有重写的方法 , 那么调用的就是父类的方法 ; Child parent_method Parent1 parent_method1

    1.7K20

    在C++中反射调用.NET(三) 使用非泛型集合的委托方法C++中的列表对象list C++传递集合数据给.NET创建泛型List实例反射静态方法反射调用索引器当委托遇到协变和逆变C++CLI

    在.NET与C++之间传输集合数据 上一篇《在C++中反射调用.NET(二)》中,我们尝试了反射调用一个返回DTO对象的.NET方法,今天来看看如何在.NET与C++之间传输集合数据。...使用非泛型集合的委托方法 先看看.NET类中的一个返回列表数据的方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...CreateEntity是EntityBuilder的静态方法,现在我们需要在C++/CLI中,反射调用此方法。...+/CLI 反射性能测试 为了测试 C++/CLI 反射调用两种方案(直接反射调用,委托方法调用)的效率,我们循环1000次测试,下面是测试代码: NetLibProxy::UserProxy^ proxy...与.NET直接调用和反射的性能比较 在本篇的方案中,都是C++反射来调用.NET方法的,如果都是在.NET应用程序中直接调用或者反射.NET方法,性能差距有多少呢?

    9.1K100

    Java虚拟机工作原理之JVM用到的3大计算机核心功能,重点是方法调用

    JVM作为一款虚拟机,也必然要涉及计算机核心的3大功能。 1、方法调用 方法作为程序组成的基本单元,作为原子指令的初步封装,计算机必须能够支持方法的调用。...同样,Java语言的原子指令是字节码,Java方法是对字节码的封装,因此JVM必须支持对Java方法的调用。 2、取指 这里的"取指",是指取出指令。...JVM作为虚拟机,也需要具备对Java字节码的运算能力。 下面重点分析JVM如何从内部调用Java方法: 如何进行方法调用?...有的编程语言由真实的物理机器运行,有的程序运行于虚拟机上。既然所有的编程语言都由函数组成,那么运行由这些编程语言所开发出来的程序的机器就必须能够执行函数调用,不管是物理机器还是虚拟机器。...JVM作为一款虚拟机,要想具备执行一个完整的Java程序的能力,就必定得具备执行单个Java函数的能力。而要具备执行Java函数的能力,首先必须得能执行函数调用。

    1.1K30
    领券