深入理解JVM虚拟机第二十八篇:详解JVM当中方法重写的本质和虚方法表

😉😉 欢迎加入我们的学习交流群呀:

✅✅1:这是孙哥suns给大家的福利!

✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料

🥭🥭3:QQ群:583783824   📚📚  工作微信:BigTreeJava 拉你进微信群,免费领取!

🍎🍎4:本文章内容出自上述:Spring应用课程!💞💞

💞💞5:以上内容,进群免费领取呦~ 💞💞💞💞

知识回顾

        因为方法的重写的出现的,导致我们出现了虚方法这种调用方式。之前我们提到的静态方法、私有方法、final方法、实例构造器、父类方法都是非虚方法,是因为从这个角度来讲,是不存在方法的重写的,你仔细品位一下,确实是这么回事的。

一:方法的重写的本质

1:本质介绍

        第一步:当我们去调用一个对象的方法的时候,首先会将这个对象压入操作数栈,经过invokeVurtual字节码指令去尝试调用方法。此时,当前被调用方法的对象位于操作数栈的栈顶,然后这个对象的方法类型被记作Type

        第二步:如果在类型 Type中找到与常量中的描述符合、简单名称都相符的方法,则进行访问权限校验,如果通过也就是有权限,则返回这个方法的直接引用,查找过程结束。如果不通过,则返回java.lang.IllegalAccessError 异常,这是一个非法访问的异常。

        第三步:否则,按照继承关系从下往上依次对Type的各个父类进行第 2 步的搜索和验证过程

        第四步:如果始终没有找到合适的方法,则抛出 java.lang.AbstractMethodError异常。

2:IllegalAccessError介绍:

        程序试图访问或修改一个属性或调用一个方法,这个属性或方法,你没有权限访问。一般的,这个会引起编译器异常,换句话说,这个大概率发生在编译阶段。这个错误如果发生在运行时,就说明一个类发生了不兼容的改变。

        举个极端例子去理解这个事。本来我们程序线上玩的特别好,程序跑的很欢快。有个同学,修改bug的时候,顺手把某个方法的修饰符public给去掉了(修改了方法适用范围),服务启动后,那么其他类在之前调用这个方法的时候没有任何问题,但是真正运行的时候可能就完蛋了,这个异常就爆出来了。

二:虚方法表

1:虚方法表概念

        在面向对象的编程中,会很频繁的使用到动态分派也就是invokeVurtual字节码指令。

        如果在每次动态分派的过程中都要重新在类的方法元数据中搜索合适的目标的话就可能影响到执行效率。因此,为了提高性能,JVM采用在类的方法区建立一个虚方法表(virtual method table) (非虚方法不会出现在表中)来实现。使用索引表来代替查找。也就是说,现在查表就行,不一层一层往上找了。

        每个类中都有一个虚方法表,表中存放着各个方法的实际入口。

2:虚方法表创建时机

        那么虚方法表什么时候被创建?虚方法表会在类加载的链接阶段被创建并开始初始化,类的变量初始值准备完成之后,JVM会把该类的方法表也初始化完毕。

        我们当时讲类加载过程中的链接这个阶段的时候,其中解析的部分讲的不是特别的透彻,因为这个回合我们后边也就是现在有一些想通的内容。解析阶段会将常量池中的符号应用转换为直接引用。这个符号就包括类的符号、方法的符号等等。

(一):例子一

        左右两侧是父类和子类在类中维护的两个虚方法表,表中蓝色部分二者都没重写,都继承自Object。子类中也直接把这些方法存到了虚方法表中,找的时候直接从索引表中可以找到Object的方法来使用需要通过父类在后在找到Object中去寻找方法。

        然后,二者都重写了hard开头的两个方法,所以箭头指向了他们自己。

(二):例子二

        继承关系图:

        Java代码编写:

interface Friendly{void sayHello();void sayGoodBye();
}class Dog{public void sayHello(){}public String toString(){return "Dog";}
}class Cat implements Friendly{public void eat(){}public void sayHello(){}public void sayGoodBye() {}public void finalize(){}
}class CockerSpaniel extends Dog implements Friendly{public void sayHello() {super.sayHello();}public void sayGoodBye() {}
}
public class VirtualMethodTable {
}

         Dog虚方法表示意图:
 

        Dog这个虚方法表重写sayHello和toString,所以这两个方法指向自己,其他的虚方法指向父类。 虚方法就不需要一层一层向上判断了。

        CockerSpaniel示意图:

        Cat的示意图:

3:虚方法表出现意义

        他的出现是因为因为方法的重写,重写导致invokeVirtual寻找方法的时候一层一层向上找,会影响方法执行的效率,JVM基于虚方法表做了调整。简化寻找过程,提升效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告

今天分享的是机器人系列深度研究报告:《2022年拉丁美洲中东和非洲医疗机器人市场及全球概况报告》。 (报告出品方:Apollo Reports) 报告共计:195页 研究方法论 2.1通过桌面研究和内部存储库的假设 a)最初&#xff…

【LeetCode刷题】-- 118.杨辉三角

118.杨辉三角 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new ArrayList<List<Integer>>();for(int i 0; i < numRows;i){List<Integer> ret new ArrayList<>();for(…

18.Java程序设计-基于Springboot的电影院售票系统的设计与实现

摘要 电影产业在当今社会中占据着重要地位&#xff0c;电影院作为观影的主要场所&#xff0c;其售票系统的高效性和用户体验至关重要。本文基于Spring Boot框架设计并实现了一款电影院售票系统&#xff0c;旨在提高售票效率、优化用户体验&#xff0c;并解决传统售票方式存在的…

PHP 之道(PHP The Right Way 中文版)

PHP 之道&#xff08;PHP The Right Way 中文版&#xff09;

我的NPI项目之Android 显示 -- 背光的电路小知识

由于使用的高通平台一直在演化&#xff0c;从SDM660,QCM4290,QCM4490再到QCM6490。产品的背光设计也是一直在迭代。 简单罗列了一下所经历的一些设计&#xff0c;简单的背光也涉及到了很多学问。 先说有哪些类型&#xff1a; 1. SDM660上由PMIC提供了wled给背光, 透过驱动直…

软件设计师——软件工程(一)

&#x1f4d1;前言 本文主要是【软件工程】——软件设计师——软件工程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

FTR223限时回归?经典三花再加金翅膀,CL500特别款亮相

FTR223可以说是非常经典的一款本田小攀爬车型了&#xff0c;之前我还有幸玩过一段时间&#xff0c;最近本田在泰国车展上展出了CL500的特别版&#xff0c;其中FTR223纪念版的版画让人眼前一亮&#xff0c;经典的白、红、蓝三色搭配让人眼前一亮。 CL500这台车在国内今年刚上市&…

笔记本电脑安装了Ubuntu系统设置关盖/合盖不挂起/不睡眠

文章目录 简介通过gnome-tweaks设置通过更改登录配置文件logind.conf设置参考资料 简介 学习工作中需要用到笔记本安装Ubuntu Linux系统&#xff0c;并且需要关盖电脑不关机、不挂起且不睡眠。为此&#xff0c;本篇博客整理了两种常规操作方式&#xff0c;并给了详细的步骤&am…

某信服 EDR 白程序DLL劫持

本文用到的白程序回复公众号20231211进行获取。 嗯… 记得去年HW的时候某信服给我装的EDR一直没卸载&#xff0c;不是不想卸载&#xff0c;是因为卸载要密码&#xff0c;所以就摆烂了。。。。 找到EDR这个目录&#xff0c;然后把目录复制到虚拟机中&#xff0c;然后一个一个e…

相控与斩控交交调压(THD的计算)

相控与斩控交交调压&#xff08;THD的计算&#xff09;

LeetCode-1008. 前序遍历构造二叉搜索树【栈 树 二叉搜索树 数组 二叉树 单调栈】

LeetCode-1008. 前序遍历构造二叉搜索树【栈 树 二叉搜索树 数组 二叉树 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;题目大致意思就是给定一个二叉树的前序遍历&#xff0c;求对应的二叉搜索树。一种比较特殊的点是「二叉搜索树」的中序遍历的结果是【有序序列】&am…

【UE5】监控摄像头效果(下)

目录 效果 步骤 一、多摄像机视角切换 二、摄像头自动旋转巡视 三、摄像头跟踪拍摄 效果 步骤 一、多摄像机视角切换 1. 打开玩家控制器“MyPlayerController”&#xff0c;添加一个变量&#xff0c;命名为“BP_SecurityCameraArray”&#xff0c;类型为“BP_SecurityCa…

蛋仔派对巅峰对决惊奇舞台必胜打法

Hello!大家好呀&#xff01;蛋仔派对我也开始玩啦&#xff01;本期我们发一个蛋仔派对巅峰对决惊奇舞台的必胜打法吧&#xff01;&#xff08;题外话&#xff1a;我的蛋仔名叫做 酷影kuying 大家能加我的好友吗&#xff1f;我是新手有老手能带我上分嘛&#xff1f;…

企业如何选择合适的信息化管理系统?

一、什么是信息化管理系统 信息化这个词在近年已经被说烂了&#xff0c;在信息化快速发展的时代&#xff0c;越来越多的企业开始意识到信息化管理系统的重要性。信息化管理系统是指一种能够帮助企业或组织有效管理信息资源&#xff0c;提高信息的可靠性、安全性和有效性的软件…

博世汽车产业转型,裁1500人 | 百能云芯

博世&#xff08;Bosch&#xff09;&#xff0c;作为全球领先的汽车零部件制造商&#xff0c;近日宣布了一项战略性的组织调整计划&#xff0c;以更好地适应不断演变的汽车行业需求和技术革新。根据《路透社》的报道&#xff0c;博世计划在2025年底之前&#xff0c;在其位于德国…

Redis基础系列-主从复制

Redis基础系列-主从复制 文章目录 Redis基础系列-主从复制1. 什么是 Redis 主从复制&#xff1f;2. 主从复制有什么好处&#xff1f;3. 如何配置 Redis 主从复制&#xff1f;4. 主从复制的验证4.1 如何查看主从搭建成功4.2 主从常见疑问4.3 主从常见命令 5. 主从复制的原理和工…

掌握1688官方API接口:开启智能商务合作新篇章

当涉及到与1688官方合作的API接口时&#xff0c;以下是一些建议和指导&#xff0c;以帮助您开始编写相关的代码。 了解API接口文档&#xff1a; 在编写与1688官方合作的API接口之前&#xff0c;首先需要了解1688官方提供的API接口文档。您可以在1688开放平台上找到相关的文档…

12.11 作业

1&#xff0c; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码…

王道数据结构课后代码题p150 第13——17 (c语言代码实现)

目录 13.p 和 q 分别为指向该二叉树中任意两个结点的指针&#xff0c;试编写算法 ANCESTOR(ROOT,P,q,r)&#xff0c;找到P和q的最近公共祖先结点 r 14.假设二叉树采用二叉链表存储结构&#xff0c;设计一个算法&#xff0c;求非空二叉树 b的宽度(即具有结点数最多的那一层的结点…

SD-WAN解决企业国际互联组网需求

随着云计算、移动应用和企业全球化的浪潮&#xff0c;实时应用在不同地点之间的传输需求不断增加&#xff0c;涵盖异地办公、视频会议、远程桌面、支付交易系统以及远程医疗等。这些应用的顺畅传输对于企业至关重要&#xff0c;而SD-WAN&#xff08;软件定义广域网&#xff09;…