2013-03-23 51 views
0

機制是如何通過繼承影響/隱藏字段的機制,並且稍後解析了JVM規範的一部分?我知道它是part of the Java spec,可以在許多博客文章和SO問題中找到。但是,當我真正查看field resolution的JVM規範時,「隱藏」或「陰影」這些詞不會出現在pdf of the JVM spec的任何位置。Java繼承的字段陰影和JVM?

我問這是因爲我正在編寫自己的JVM,並發現這個字段映射是字節碼/ VM的屬性,而不僅僅是Java編譯器或Java語言的一部分。我想知道這應該在虛擬機級別實施的適當的權威方式。當然,這個重要的JVM的(錯誤?)功能需要在某個地方正式記錄嗎?

回答

0

術語陰影通常指的是當一個標識符映射到另一個陰影時。即一個給定的名稱可以指多個變量,所以必須有一個機制來消除它的歧義。這主要是一種語言級別的構造,因爲它包含更多的名稱。除了可選的調試信息外,局部變量名稱不會出現在字節碼中。

從字節碼的角度來看,您已經有了對類,名稱和描述符的明確引用。唯一的問題是你描述的字段是否在你指定的類中實際聲明,或者它是否從它的一個超類繼承。

正如您已經發現的那樣,Field Resolution在該標準的5.4.3.2部分進行了說明。術語隱藏和陰影不被使用,因爲它們適用於源代碼而不是類文件。

+0

雖然我指的是繼承字段的陰影。字段名稱出現在字節碼中。而且我發現了這個事實,因爲我的DIY JVM(沒有處理這個陰影)對於相同的字節碼v.s獲得了不同的結果。在真正的JVM上執行它。而且,當我在我的DIY JVM中混入了一些類似繼承領域的陰影邏輯時,他們開始在我的單元測試中吐出相同的結果。我非常肯定,虛擬機必須要處理的是繼承字段陰影。 – 2013-03-23 03:09:15

+0

@Li對於我來說,現場分辨率的規格看起來非常簡單。你在哪裏遇到問題? – Antimony 2013-03-23 03:11:02

+0

您是否有規範未涵蓋的任何代碼示例?我認爲你可能會對這樣的事實感到困惑,即雖然字段是被繼承的,但它們並不像方法那樣被虛擬地調度。 – Antimony 2013-03-23 03:20:02