国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

從HotSpot虛擬機源碼了解Java的訪問控制修飾符

云計算 虛擬化
前面Ribbon源碼分析文章,有讀者留言提問:XX類是包私有的,重寫不會報錯嗎?答案其實是XX類并非包私有,而是一個protected的靜態內部類,所以重寫不會報錯。

 [[340301]]

前面Ribbon源碼分析文章,有讀者留言提問:XX類是包私有的,重寫不會報錯嗎?答案其實是XX類并非包私有,而是一個protected的靜態內部類,所以重寫不會報錯。

關于Java訪問控制修飾符的作用,筆者在初學Java時也是靠記,寫多了代碼自然也就能理解,但筆者很好奇底層的實現,所以也嘗試從HotSpot虛擬機源碼尋找答案,解答我多年來的疑惑。

類、字段、方法都有哪些訪問控制修飾符?

私有<private>、子類可訪問<protected>、公開public、包私有<package>,默認不加訪問控制修飾符就是包私有。

訪問范圍 private package protected public
同一個 可訪問 可訪問 可訪問 可訪問
同一包中的其他類 不可訪問 可訪問 可訪問 可訪問
不同包中的子類 不可訪問 不可訪問 可訪問 可訪問
不同包中的非子類 不可訪問 不可訪問 不可訪問 可訪問

包私有<package>指的是只有同一個包下的類可訪問,其它包下的類不可訪問。

今天我們就深入java虛擬機去探究這些訪問控制修飾符語意的實現。

InstanceKlass是HotSpot VM中對應class文件結構的數據結構,InstanceKlass對象是一個Java類被HotSpot VM加載后所生成的C++對象,被存于方法區。我們在Java代碼中使用的Class對象實際是InstanceKlass的一個鏡像。

Java支持使用"this."、"suppor."、"某個對象."調用一個方法,或"某個類."調用靜態方法,在我們看來是調用某個類的靜態方法或者對象的方法,但這在虛擬機中并不存在區別,都是一個方法調用。

調用靜態方法和對象方法的區別只在于,調用對象的方法需要在方法參數傳遞一個"this"引用,這是一個隱式參數,在編譯器將Java代碼編譯成字節碼時自動添加上。

而Java代碼中使用"this."、"suppor."調用自身方法和父類方法的不同,僅僅只是生成方法調用字節碼指令的操作數指向的Methodref常量不同,方法的第一個隱式參數傳遞的對象都是同一個。Methodref常量指代一個方法的符號引用,包括類名、方法名、方法描述符。

我們知道,類加載過程包括加載、鏈接、初始化三個階段,其中鏈接階段又可細分為驗證、準備和解析三個階段。下面這張圖有助于我們理解類加載的幾個階段,但并不準確。

《Java虛擬機規范》只是規定類加載需要完成的事情,而對順序并沒有嚴格的要求。

下圖為筆者閱讀HotSpot虛擬機類加載源碼總結出的一張流程圖,僅供參考。(如需要獲取原圖,可在公眾號回復:"hotspot")

在HotSpot虛擬機中,鏈接階段的準備階段在加載階段之后完成,鏈接階段的驗證也分多種驗證,其中文件格式驗證、元數據驗證在加載階段交叉完成,而字節碼驗證階段則在類初始化之前才觸發,解析階段則在類加載完成之后。

引起類初始化的幾條指令如new、getstatic、putstatic、invokestatic,虛擬機在執行這些指令時,先判斷類是否已經初始化,未初始化則完成類的初始化,鏈接階段會在類初始化階之前觸發。

鏈接階段的解析階段是Java虛擬機將常量池內的符號引用替換為直接引用的過程,根據《Java虛擬機規范》規定,在ane-warray、checkcast、getfield、getstatic、instanceof、invokedynamic、invokeinterface、invoke-special、invokestatic、invokevirtual、ldc、mulianewarray、new、putfield、putstatic這些要求操作數指向常量池中的符號引用常量(如:CONSTANT_Class_info、CONSTANT_Field_info、CONSTANT_Methodref_info)的指令執行之前,必須先對使用的符號引用進行解析。

符號引用以一組符號描述引用的目標,如CONSTANT_Class_info表示引用的類、CONSTANT_Field_info表示引用哪個類的哪個字段、CONSTANT_Methodref_info表示引用哪個類的哪個方法。

符號引用驗證發生在解析階段,符號引用驗證包括:通過字符串描述的全限定名是否能找到對應的類、在指定的類中是否存在簡單名稱所描述的方法和字段、符號引用中的類、字段、方法的可訪問性( 、public、 )。

在HotSpot虛擬機的實現中,對于解釋執行與動態調用(invokedynamic),解析階段是在符號引用將要被使用前才去解析。

方法調用源碼:javaCalls.cpp; 鏈接解析源碼:linkResolver.cpp;

  1. // 檢查類 
  2. LinkResolver::check_klass_accessability 
  3. // 檢查方法 
  4. LinkResolver::check_method_accessability 
  5. // 檢查字段 
  6. LinkResolver::check_field_accessability 

這些方法調用最后都調用Reflection類的對應verify方法完成是否可訪問的判斷,例如Reflection::verify_field_access方法。

Java虛擬機在解析class文件結構時、在字節碼驗證階段,也會對訪問控制修飾符進行驗證。

例如,在解析class文件結構時,驗證是否能夠繼承父類(Reflection::verify_class_access):

類的訪問修飾符決定了一個類是否可以被其它類訪問。在解析class文件結構階段,虛擬機可以驗證當前類是否能夠繼承父類(父類的訪問控制修飾符決定)、是否能夠實現每個接口(接口的訪問修飾符決定)。

在字節碼驗證階段則驗證當前類是否可以訪問目標類的protected修飾的方法或字段:

在字節碼驗證階段,虛擬機會對類的每個方法中的每條字節碼指令都會進行驗證,但虛擬機在字節碼驗證階段,只對getfield指令做了check_protected驗證。可見,字節碼驗證階段沒有做過多的訪問控制驗證。

本文轉載自微信公眾號「 Java藝術」,可以通過以下二維碼關注。轉載本文請聯系 Java藝術公眾號。

[[340304]]

 

責任編輯:武曉燕 來源: Java藝術
相關推薦

2009-06-19 10:51:39

Scalapackage訪問修飾符

2009-06-12 13:37:47

訪問權限修飾符Java教程

2009-08-24 16:49:39

C#修飾符

2021-09-10 00:34:22

Java 線程啟動

2009-09-04 11:06:40

C#訪問修飾符

2010-11-05 09:47:11

OracleJava虛擬機

2009-06-12 14:46:05

static修飾符Java教程

2015-08-18 09:25:11

Java修飾符關鍵詞

2012-08-06 09:26:19

Java虛擬機垃圾回收

2011-06-02 14:51:07

JAVA修飾符

2023-12-29 09:01:27

SwiftUI視圖修飾符

2009-08-27 11:04:08

C# extern修飾

2009-08-27 13:06:13

C# new修飾符

2009-09-02 17:14:28

C#修飾符

2025-08-15 11:10:54

2021-11-21 22:36:18

Java修飾符開發

2009-08-27 11:12:03

C# abstract

2009-08-21 13:58:06

C# virtual修

2023-09-25 08:19:37

LinuxVirtualBox虛擬機

2009-09-02 17:04:35

C# Extern修飾
點贊
收藏

51CTO技術棧公眾號

eeuss影院95999部| 九色91视频| 毛片.com| 国产精品888| 国产精品爱久久久久久久| h片在线观看视频免费| 一区二区欧美视频| 18禁裸男晨勃露j毛免费观看| 亚洲91中文字幕无线码三区| 日韩在线精品视频| www在线观看播放免费视频日本| 亚洲欧洲成人av每日更新| 国产一区二区四区| 免费人成在线不卡| 国产精品成人观看视频免费| 国产精选一区| 欧美高清在线播放| 精品无人乱码一区二区三区 | 国产一区二区免费电影| 精品视频一区二区三区| 亚洲国产天堂久久综合网| av在线之家电影网站| 亚洲男人的天堂在线aⅴ视频| 日韩精品一区二区三区久久| 狠狠色狠狠色合久久伊人| 日本高清不卡三区| 亚洲国产精品第一区二区三区| 国产噜噜噜噜噜久久久久久久久 | 久久久久久久网| 91精品一区二区三区四区| 久久久久免费| 欧美理论一区二区| 亚洲麻豆视频| 国产伦精品一区二区三区照片91| 日韩精品久久| 欧美亚洲在线视频| 国产成人福利av| 免费91在线视频| 国产午夜久久av| 日韩一区二区福利| 国产日本久久| 欧美另类交人妖| 黑人久久a级毛片免费观看| 久久久之久亚州精品露出| 97视频一区| 久久久久久久色| 精品国产欧美日韩| 国产一区二区丝袜| 国产精品v日韩精品v欧美精品网站| 成人乱色短篇合集| 欧美午夜免费影院| 欧美久久在线| 国产精品 日产精品 欧美精品| 日本男女交配视频| av动漫一区二区| 中文字幕成人在线视频| 一区二区三区成人| 青青草免费在线| 欧美一个色资源| 欧美性xxx| 午夜精品一区二区三区av| 蜜臀91精品国产高清在线观看| 国产一区二区视频在线观看| 影音国产精品| 综合色婷婷一区二区亚洲欧美国产| 粉嫩绯色av一区二区在线观看 | 亚洲综合av一区二区三区| www国产精品视频| 欧美日韩看看2015永久免费 | 2021中文字幕在线| 亚洲人a成www在线影院| 玖玖精品一区| 青青草成人在线| 午夜久久免费观看| 欧美另类高清视频在线| 国产精品一二三区| av成人网在线| 欧美电影一区二区| 欧美三级电影网址| 国产精品青青在线观看爽香蕉| 一区二区毛片| 日本五级黄色片| 亚洲永久精品大片| 性欧美video高清bbw| 欧美国产日韩中文字幕在线| 欧美人成在线| 免费av手机在线观看| 欧美日韩国产一中文字不卡 | 成年人在线视频免费观看| 亚洲激情自拍图| 女同另类激情重口| 日本一区美女| 亚洲图片激情小说| 色婷婷视频在线观看| 777午夜精品福利在线观看| 亚洲黄色在线| 成人网18免费网站在线| 精品国产伦一区二区三区观看体验 | 欧美在线色图| 午夜欧美性电影| 国产日韩欧美一区二区三区乱码| 国产69精品久久app免费版| 亚洲一区二区久久| 最新国产精品| 无码人妻丰满熟妇区毛片| 亚洲精品欧美专区| xxx性欧美| 成人黄色在线播放| 97国产一区二区| 在线观看h片| 欧美黄色成人网| 日本aⅴ免费视频一区二区三区| 九七伦理97伦理手机| 精品一区二区三区四区| 一区二区三区午夜探花| 黄色高清无遮挡| 日韩电影大全免费观看2023年上| 91亚洲国产| 波多野结衣作品集| 精品国产乱码久久久久久蜜臀| 欧美日韩国产一区二区三区不卡 | 成人免费观看网站| 99精品视频在线观看| av影片免费在线观看| 性欧美亚洲xxxx乳在线观看| 日韩精品三区四区| 最新精品视频在线| 国内精品中文字幕| 成人性生交大片免费看视频在线| 日本免费视频在线观看| 国产精品大片wwwwww| 久久只精品国产| 91精品产国品一二三产区| 久久国产精品免费一区| 亚洲自拍偷拍av| 高清精品视频| av免费中文字幕| 中文字幕久热精品视频在线| 日韩中文欧美在线| 天堂中文8资源在线8| 国产精品久久婷婷六月丁香| 久久精品日韩一区二区三区| av剧情在线观看| 欧美日韩在线精品一区二区三区| 欧美日韩国产在线看| 精品国产精品| 91午夜在线| 国产精品视频永久免费播放| 一区二区三区中文字幕电影| 日本韩国欧美超级黄在线观看| 色婷婷综合久久久久中文字幕| 北条麻妃一区二区三区中文字幕| 国产成人免费在线观看| 日本福利视频网站| 99在线热播| 夜夜嗨av色综合久久久综合网| 国产盗摄女厕一区二区三区| 国产精品毛片久久| 国产美女在线播放| 成人做爰www免费看视频网站| 欧美日韩激情在线| 狠狠色狠狠色综合日日91app| 精品美女久久久| 国产黄色小视频在线| 欧美乱偷一区二区三区在线| 欧美日韩精品综合在线| 国产成人av一区二区| 亚洲精品日产| 性生活免费观看视频| 日韩三级.com| 精品一区二区成人精品| 香蕉网站在线| 亚洲mm色国产网站| 中文字幕午夜精品一区二区三区| 日韩在线视频观看正片免费网站| 久久久精品日韩| 色呦呦在线观看视频| 伊人天天久久大香线蕉av色| 精品丝袜一区二区三区| 国产高清亚洲一区| 91麻豆精品| 国产毛片视频| 91午夜理伦私人影院| 欧美视频一区二区三区四区 | 免费视频观看成人| 成人黄色片视频| 欧美一级免费视频| 亚洲高清中文字幕| 99国产精品久久久久久久成人热| 日本伦理一区二区| 国产乱子伦精品视频| 欧美激情免费视频| 亚洲妇女屁股眼交7| 99精品国产99久久久久久福利| 免费电影网站在线视频观看福利| 国产欧美精品aaaaaa片| 欧美自拍视频在线| 欧美日韩免费一区二区三区视频 | 亚洲啊v在线观看| 午夜伦理大片视频在线观看|