深入理解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.pswp.cn/news/214772.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/214772.shtml
英文地址,請注明出處:http://en.pswp.cn/news/214772.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2022年拉丁美洲中東和非洲醫療機器人市場及全球概況報告

今天分享的是機器人系列深度研究報告:《2022年拉丁美洲中東和非洲醫療機器人市場及全球概況報告》。 (報告出品方:Apollo Reports) 報告共計:195頁 研究方法論 2.1通過桌面研究和內部存儲庫的假設 a)最初&#xff…

基于java的Redis工具類可緩存Object,list,set,map!!!

目錄 簡介:springboot redis啟動器redis配置:工具類 簡介: 添加redis啟動器,配置redis相關配置,使用工具類緩存數據 封裝的方法有:緩存Object,list,set,map類型數據的方法、獲取指定key的value、判斷指定k…

【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…

Ubuntu20 USB 權限配置

// &#xff08;保姆級&#xff09;Ubuntu下的USB設備永久權限設備起別名方法 cd /etc/udev/rules.dsudo vim motor_control_usb.rules增加如下內容SUBSYSTEMS"usb", ATTRS{idVendor}"0483", ATTRS{idProduct}"2000", GROUP"edda", …

某信服 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;…

第二十四章 STL-函數對象

一、函數對象 1、函數對象概念 概念&#xff1a; 重載函數調用操作符的類&#xff0c;其對象常稱為函數對象 函數對象使用重載的()時&#xff0c;行為類似函數調用&#xff0c;也叫仿函數 本質&#xff1a; 函數對象(仿函數)是一個類&#xff0c;不是一個函數 2、函數對…

[方法論]allocation 空間內容分配

區分度 typeanalysisrecognitionconclusion type - 閱讀 - 理解- 背誦- 聽課 看 聽 思考- reproduce/ 默寫/ 應用- 背- 想- 寫analysis 理解 和 背 是不占用現實空間的&#xff0c;可以在腦內不斷消化&#xff0c;可以飛配給沒有空間的時間塊。 閱讀 和 寫是占用現實空間的…

企業如何選擇合適的信息化管理系統?

一、什么是信息化管理系統 信息化這個詞在近年已經被說爛了&#xff0c;在信息化快速發展的時代&#xff0c;越來越多的企業開始意識到信息化管理系統的重要性。信息化管理系統是指一種能夠幫助企業或組織有效管理信息資源&#xff0c;提高信息的可靠性、安全性和有效性的軟件…

博世汽車產業轉型,裁1500人 | 百能云芯

博世&#xff08;Bosch&#xff09;&#xff0c;作為全球領先的汽車零部件制造商&#xff0c;近日宣布了一項戰略性的組織調整計劃&#xff0c;以更好地適應不斷演變的汽車行業需求和技術革新。根據《路透社》的報道&#xff0c;博世計劃在2025年底之前&#xff0c;在其位于德國…

【OD2023C卷真題】20天拿下華為OD筆試之【排序】2023C-身高提供排序【歐弟算法】全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入描述輸出描述示例一輸入輸出 示例二輸入輸出 解題思路代碼時空復雜度 進階華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描述 某學校舉行運動會,學生們按編號(1、2、3.....n) 進行標識, 現需要按照身高由低到高排列&a…