類的解析過程

類或接口的解析

假設(shè)當(dāng)前代碼所處的類為D每界,如果要把一個從未解析過的符號引用N解析為一個類或接口C的直接引用誉裆,那虛擬機(jī)完成整個解析的過程需要以下3個步驟:

  1. 如果C不是一個數(shù)組類型永脓,那虛擬機(jī)將會把代表N的全限定名傳遞給D的類加載器去加載這個類C。在加載過程中间驮,由于元數(shù)據(jù)驗(yàn)證驾凶、字節(jié)碼驗(yàn)證的需要尘奏,又可能觸發(fā)其他相關(guān)類的加載動作滩褥,例如加載這個類的父類或?qū)崿F(xiàn)的接口。一旦這個加載過程出現(xiàn)了任何異常炫加,解析過程就宣告失敗瑰煎。

  2. 如果C是一個數(shù)組類型,并且數(shù)組的元素類型為對象俗孝,也就是N的描述符會是類似“[Ljava/lang/Integer”的形式酒甸,那將會按照第1點(diǎn)的規(guī)則加載數(shù)組元素類型。如果N的描述符如前面所假設(shè)的形式赋铝,需要加載的元素類型就是“java.lang.Integer”插勤,接著由虛擬機(jī)生成一個代表此數(shù)組維度和元素的數(shù)組對象。

  3. 如果上面的步驟沒有出現(xiàn)任何異常,那么C在虛擬機(jī)中實(shí)際上已經(jīng)成為一個有效的類或接口了农尖,但在解析完成之前還要進(jìn)行符號引用驗(yàn)證析恋,確認(rèn)D是否具備對C的訪問權(quán)限。如果發(fā)現(xiàn)不具備訪問權(quán)限卤橄,將拋出java.lang.IllegalAccessError異常绿满。

字段解析

要解析一個未被解析過的字段符號引用臂外,首先將會對字段表內(nèi)class_index項(xiàng)中索引的CONSTANT_Class_info符號引用進(jìn)行解析窟扑,也就是字段所屬的類或接口的符號引用。如果在解析這個類或接口符號引用的過程中出現(xiàn)了任何異常漏健,都會導(dǎo)致字段符號引用解析的失敗嚎货。如果解析成功完成,那將這個字段所屬的類或接口用C表示蔫浆,虛擬機(jī)規(guī)范要求按照如下步驟對C進(jìn)行后續(xù)字段的搜索殖属。

  1. 如果C本身就包含了簡單名稱和字段描述符都與目標(biāo)相匹配的字段,則返回這個字段的直接引用瓦盛,查找結(jié)束洗显。

  2. 否則,如果在C中實(shí)現(xiàn)了接口原环,將會按照繼承關(guān)系從下往上遞歸搜索各個接口和它的父接口挠唆,如果接口中包含了簡單名稱和字段描述符都與目標(biāo)相匹配的字段,則返回這個字段的直接引用嘱吗,查找結(jié)束玄组。

  3. 否則,如果C不是java.lang.Object的話谒麦,將會按照繼承關(guān)系從下往上遞歸搜索其父類俄讹,如果在父類中包含了簡單名稱和字段描述符都與目標(biāo)相匹配的字段,則返回這個字段的直接引用绕德,查找結(jié)束患膛。

  4. 否則,查找失敗耻蛇,拋出java.lang.NoSuchFieldError異常踪蹬。

  5. 如果查找過程成功返回了引用,將會對這個字段進(jìn)行權(quán)限驗(yàn)證城丧,如果發(fā)現(xiàn)不具備對字段的訪問權(quán)限延曙,將拋出java.lang.Ille-galAccessError異常。

類方法解析

類方法解析的第一個步驟與字段解析一樣亡哄,也需要先解析出類方法表的class_index項(xiàng)中索引的方法所屬的類或接口的符號引用枝缔,如果解析成功,我們依然用C表示這個類,接下來虛擬機(jī)將會按照如下步驟進(jìn)行后續(xù)的類方法搜索愿卸。

  1. 類方法和接口方法符號引用的常量類型定義是分開的灵临,如果在類方法表中發(fā)現(xiàn)class_index中索引的C是個接口,那就直接拋出java.lang.IncompatibleClassChangeError異常趴荸。

  2. 如果通過了第1步儒溉,在類C中查找是否有簡單名稱和描述符都與目標(biāo)相匹配的方法,如果有則返回這個方法的直接引用发钝,查找結(jié)束顿涣。

  3. 否則,在類C的父類中遞歸查找是否有簡單名稱和描述符都與目標(biāo)相匹配的方法酝豪,如果有則返回這個方法的直接引用涛碑,查找結(jié)束。

  4. 否則孵淘,在類C實(shí)現(xiàn)的接口列表及它們的父接口之中遞歸查找是否有簡單名稱和描述符都與目標(biāo)相匹配的方法蒲障,如果存在匹配的方法,說明類C是一個抽象類瘫证,這時查找結(jié)束揉阎,拋出java.lang.AbstractMethodError異常。

  5. 否則背捌,宣告方法查找失敗毙籽,拋出java.lang.NoSuchMeth-odError。

  6. 最后载萌,如果查找過程成功返回了直接引用惧财,將會對這個方法進(jìn)行權(quán)限驗(yàn)證,如果發(fā)現(xiàn)不具備對此方法的訪問權(quán)限扭仁,將拋出java.lang.IllegalAccessError異常垮衷。

接口方法解析

接口方法也需要先解析出接口方法表的class_index項(xiàng)中索引的方法所屬的類或接口的符號引用,如果解析成功乖坠,依然用C表示這個接口搀突,接下來虛擬機(jī)將會按照如下步驟進(jìn)行后續(xù)的接口方法搜索。

  1. 與類方法解析不同熊泵,如果在接口方法表中發(fā)現(xiàn)class_index中的索引C是個類而不是接口仰迁,那就直接拋出java.lang.Incom-patibleClassChangeError異常。

  2. 否則顽分,在接口C中查找是否有簡單名稱和描述符都與目標(biāo)相匹配的方法徐许,如果有則返回這個方法的直接引用,查找結(jié)束卒蘸。

  3. 否則雌隅,在接口C的父接口中遞歸查找翻默,直到j(luò)ava.lang.Object類(查找范圍會包括Object類)為止,看是否有簡單名稱和描述符都與目標(biāo)相匹配的方法恰起,如果有則返回這個方法的直接引用修械,查找結(jié)束。

  4. 否則检盼,宣告方法查找失敗肯污,拋出java.lang.NoSuchMeth-odError異常。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吨枉,一起剝皮案震驚了整個濱河市蹦渣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌东羹,老刑警劉巖剂桥,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異属提,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)美尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門冤议,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人师坎,你說我怎么就攤上這事恕酸。” “怎么了胯陋?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵蕊温,是天一觀的道長。 經(jīng)常有香客問我遏乔,道長义矛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任盟萨,我火速辦了婚禮凉翻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捻激。我一直安慰自己制轰,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布胞谭。 她就那樣靜靜地躺著垃杖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丈屹。 梳的紋絲不亂的頭發(fā)上调俘,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼脉漏。 笑死苞冯,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的侧巨。 我是一名探鬼主播舅锄,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼司忱!你這毒婦竟也來了皇忿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤坦仍,失蹤者是張志新(化名)和其女友劉穎鳍烁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體繁扎,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡幔荒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梳玫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爹梁。...
    茶點(diǎn)故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖提澎,靈堂內(nèi)的尸體忽然破棺而出姚垃,到底是詐尸還是另有隱情,我是刑警寧澤盼忌,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布积糯,位于F島的核電站,受9級特大地震影響谦纱,放射性物質(zhì)發(fā)生泄漏看成。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一服协、第九天 我趴在偏房一處隱蔽的房頂上張望绍昂。 院中可真熱鬧,春花似錦偿荷、人聲如沸窘游。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忍饰。三九已至,卻和暖如春寺庄,著一層夾襖步出監(jiān)牢的瞬間艾蓝,已是汗流浹背力崇。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赢织,地道東北人亮靴。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像于置,于是被迫代替她去往敵國和親茧吊。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.加載八毯,將二進(jìn)制字節(jié)流加載到方法區(qū),然后在java堆中實(shí)例化一個java.lang.Class類的對象2.驗(yàn)證:...
    蒸汽飛船閱讀 808評論 0 0
  • 1.加載搓侄,將二進(jìn)制字節(jié)流加載到方法區(qū),然后在java堆中實(shí)例化一個java.lang.Class類的對象2.驗(yàn)證:...
    蒸汽飛船閱讀 261評論 0 0
  • 今天下午四點(diǎn)半左右聽到清脆的雷聲,這是今年的首次春雷话速,近五點(diǎn)雨開始下了起來讶踪,雖說正值下班時間行車不是很方便,雨刷也...
    孫德娟欣欣兒閱讀 317評論 0 0
  • 當(dāng)一個人做自己喜歡的事情時泊交,心情也會隨之開心乳讥,雖然我現(xiàn)在一直在臨摹別人的作品,但是日積月累中活合,總會慢慢進(jìn)步雏婶。每個人...
    予安安閱讀 258評論 0 0
  • Apk改之理(ApkIDE)下載地址:點(diǎn)擊這里(還是舊版本哦!)白指,apkide短期內(nèi)或長期內(nèi)或永久不會更新(現(xiàn)在不...
    鰻駝螺閱讀 6,731評論 15 1