返回顶部
首页 > 资讯 > 后端开发 > Python >JVM方法调用invokevirtual详解
  • 541
分享到

JVM方法调用invokevirtual详解

2024-04-02 19:04:59 541人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

  在java代码运行期间,方法间的调用可以说是最为频繁的了,那么这些方法间的调用在底层的虚拟机又做了什么事情呢?现在就让我们揭开那道神秘的面纱。   JVM调用方法有五条指令,分别

  在java代码运行期间,方法间的调用可以说是最为频繁的了,那么这些方法间的调用在底层的虚拟机又做了什么事情呢?现在就让我们揭开那道神秘的面纱。

  JVM调用方法有五条指令,分别是invokestatic,invokespecial,invokevirtual,invokeinterface,invokedynamic。invokestatic用来调用静态方法;invokespecial用来调用私有方法,父类方法(super.),类构造器方法;invokeinterface调用接口方法;invokedynamic方法动态执行;invokevirtual调用所有虚方法,即除了以上的方法外全用invokevirtual调用。

  这篇文章主要是说明invokevirtual方法的调用,以一个例子来说明。

class Father{
    public void fMe(){
        System.out.println("fMe");
        fMe1();//invovespecial调用
        System.out.println(this);
        this.fMe1();//invovespecial调用
    }
    private void fMe1(){
        System.out.println("fMe1");
}
class Son extends Father{  public void fMe1(){        System.out.println("sMe1");    }
public class ThisTest{
    public static void main(String[] args) {
        Father test = new Son();
        test.fMe();//编译时指向父类中国的fMe(),在运行时由于是invokevirtual调用,因此test将变成实际类型Son,如果Son中有Fme(),就调用Son自己的,若没有就调用父类的

  父类Father中有一个public方法fMe()和一个私有方法fMe1(),子类中没有对其方法覆盖,在测试类ThisTest中 Father test = new Son();,并调用fMe(),再在fMe()中调用自己的私有方法fMe1()。在如上的几个方法调用中test.fMe()是invokevirtual调用,编译时指向父类中国的fMe(),在运行时由于是invokevirtual调用,因此test将变成实际类型Son,如果Son中有fMe(),就调用Son自己的,若没有就调用父类的,此时是调用父类的;在父类中 的fMe1()是invovespecial调用。疑问(也是写这篇文章的目的):上面的this代表Son,既然是invovespecial调用,那么应该是调用Son的fMe1()才对啊,为什么是调用父类的fMe1()。(虽然感觉好无厘头,明明是private方法了,肯定只有这样的调用了)

  下面给出我自己的理解,不知道对不对!

  上面的用this调用的时候,我觉得在编译期间,this代表的是Father类,而不是Son类,正因为是这样,在用invovespecial字节码调用的时候采用在编译器就确定好了指向父类fMe1()方法,而不是子类的方法。为了确定我说的,我采用了两种方式去验证:1是用MyEclipse的动态提示,2是将fMe1()方法改为public,这样在字节码指invokevirtual调用的时候看是不是在运行期间改变this为实际类型Son类,即是不是去调用子类的fMe1()方法。

  1:我在MyEclipse中用提示键得到如下,可以看出只有父类的两个方法,并没有子类Son的方法。

2、在我将fMe1()方法改为public后确实是调用的是子类的方法。

class Father{
    public void fMe(){
        System.out.println("fMe");
        this.
        fMe1();//invovespecial调用
        System.out.println(this);
        this.fMe1();//invovespecial调用
    }
     
    public void fMe1(){
        System.out.println("fMe1");
}
 
class Son extends Father{
        System.out.println("sMe1");
public class ThisTest{
    public static void main(String[] args) {
        Father test = new Son();
        test.fMe();//编译时指向父类中国的fMe(),在运行时由于是invokevirtual调用,因此test将变成实际类型Son,如果Son中有Fme(),就调用Son自己的,若没有就调用父类的

  这是在看invokevirtual想到的,不知道对不对,如果谁能解开我的这个疑惑真是会十分感谢。

到此这篇关于JVM方法调用invokevirtual的文章就介绍到这了,更多相关JVM方法调用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JVM方法调用invokevirtual详解

本文链接: https://lsjlt.com/news/143231.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • JVM方法调用invokevirtual详解
      在java代码运行期间,方法间的调用可以说是最为频繁的了,那么这些方法间的调用在底层的虚拟机又做了什么事情呢?现在就让我们揭开那道神秘的面纱。   JVM调用方法有五条指令,分别...
    99+
    2024-04-02
  • JVM 方法调用之静态分派(详解)
    分派(Dispatch)可能是静态也可能是动态的,根据分派依据的宗量数可分为单分派和多分派。这两种分派方式的两两组合就构成了静态单分派,静态多分派,动态单分派,动态多分派这4种组合。本章讲静态分派。1、静态分派所有依赖静态类型来定位方法执行...
    99+
    2023-05-31
    jvm 方法调用 静态
  • Spring之从桥接方法到JVM方法调用解读
    目录前言桥接方法什么时候会出现桥接方法?为什么需要桥接方法?总结前言 之所以写这么一篇文章是因为在Spring中,经常会出现下面这种代码 // 判断是否是桥接方法,如果是的话就返回这...
    99+
    2023-01-01
    Spring桥接方法 Spring JVM方法 Spring方法调用
  • 详解JVM中的GC调优
    目录那些GC的默认值GC的选择GC的最大线程个数初始化heap size最大的heap size分层编译技术我们到底要什么最大暂停时间吞吐率那些GC的默认值 其实GC或者说JVM的参...
    99+
    2024-04-02
  • Java JVM虚拟机调优详解
    目录jmap查看内存信息jstackjinfo查看jvm系统参数Jstat查看堆内存使用和类加载的数量信息内存泄漏jmap查看内存信息 jmap histo /pid > ./...
    99+
    2024-04-02
  • JVM之方法返回地址详解
    JVM之方法返回地址 JVM运行时数据区的虚拟机栈的栈帧中包含了返回地址 当一个方法开始执行后,只有两种方式可以退出这个方法。 第一种方式是执行引擎遇到任意一个方法返回的字节码指令(...
    99+
    2024-04-02
  • java虚拟机之JVM调优详解
    目录JVM常用命令行参数1. 查看参数列表2. 基本参数说明:3. 扩展参数说明:虚拟机参数分类什么是调优1.调优步骤:2.调优案例2.1案例一2.2案例二JVM优化总结JVM常用命...
    99+
    2024-04-02
  • 如何理解JVM调优参数、方法、工具
    这篇文章主要介绍“如何理解JVM调优参数、方法、工具”,在日常操作中,相信很多人在如何理解JVM调优参数、方法、工具问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解JVM调优参数、方法、工具”的疑惑有所...
    99+
    2023-06-15
  • JVM常用参数调优方法是什么
    本篇内容介绍了“JVM常用参数调优方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!对于调优这个事情来说,一般就是三个过程:性能监控:...
    99+
    2023-06-02
  • 详解Struts2动态方法调用
     动态方法就是一个Action对应多个请求,减少Action的数量1、指定method属性<action name="addAction" method="add" class="com.venn.action.HelloWorldA...
    99+
    2023-05-31
    struts2 st
  • python调用matlab的方法详解
    目录1.python版本与matlab版本的对应关系2.import matlab.engine的问题3.代码报错:please use torch.load with map_lo...
    99+
    2024-04-02
  • JVM调优方法的示例分析
    这篇文章主要介绍了JVM调优方法的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。JVM调优总结Young(年轻代)年轻代分三个区。一个Eden区,两个Survivor...
    99+
    2023-06-17
  • java jvm调优的方法是什么
    Java虚拟机(JVM)调优是通过优化Java应用程序的运行时环境来提高性能和吞吐量的过程。以下是一些常见的JVM调优方法:1. 增...
    99+
    2023-10-10
    java jvm
  • python 调用c语言方法详解
      Python是一种强大的编程语言, Python在代码的编写中可以使用任何一种编程语言,可以利用其内置函数或模块来完成自己的任务。但是在 Python中调用其他语言的程序时,需要有特定的环境,例如:C、C++等。 在 python中调...
    99+
    2023-09-13
    python c语言 pycharm
  • Java+Selenium调用JavaScript的方法详解
    目录简介调用JavaScript滑动滚动条简介 本文主要讲解java 利用Selenium 操作浏览器网站时候,需要用的js的地方,代码该如何实现。 调用JavaScript web...
    99+
    2023-01-09
    Java Selenium调用JavaScript Selenium调用JavaScript Java Selenium JavaScript
  • jvm性能调优的方法是什么
    JVM性能调优的方法包括以下几个方面:1. 内存调优:通过调整JVM的堆内存大小(-Xmx和-Xms参数)来优化内存使用效率,避免过...
    99+
    2023-10-10
    jvm
  • jvm内存调优的方法是什么
    JVM内存调优的方法有以下几种: 调整堆内存大小:可以通过设置-Xmx和-Xms参数来调整堆内存的大小。增大堆内存可以提高应用程...
    99+
    2023-10-27
    jvm
  • Oracle11g调整SGA方法详解
    oracle11gSGA调整方法 oracle11g修改sga要先修改memory_target等参数,否则服务重启时会出现错误ORA-00844: Parameter not taking MEMORY_TARGET ...
    99+
    2022-07-11
    Oracle11gSGA调整 Oracle11gSGA
  • json跨域调用python的方法详解
    本文实例讲述了json跨域调用python的方法。分享给大家供大家参考,具体如下: 客户端: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi...
    99+
    2022-06-04
    详解 方法 json
  • Python调用C++程序的方法详解
    前言 大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,或是在C++项目中用Python实现外围功能,都可能遇到Pyth...
    99+
    2022-06-04
    详解 程序 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作