1. 程式人生 > >java class file

java class file

發生 完全 字段類型 全限定名 實例 nic 實例變量 int 除了

目錄

  • 什麽是java類文件
    • 幻數
    • 主次版本號
    • 常量池數和常量池
    • this_class
    • super_class
    • 接口數量和接口
    • 字段數和字段
    • 方法數和方法

什麽是java類文件

Java類文件是一個精確定義為Java程序二進制文件格式。每個Java類文件是一個Java類或接口的完整描述。沒有辦法把多個類或接口到單個類文件。精確定義的類文件格式可以確保任何Java類文件可以加載和正確解釋任何Java虛擬機,無論什麽系統產生的類文件或系統主機的虛擬機。

雖然類文件與Java語言架構,它不是Java語言密不可分。你可以用其他語言編寫程序並編譯類文件,或者你可以編譯Java程序不同的二進制文件格式。然而,大多數Java程序員會使用類文件作為主要工具提供Java虛擬機的程序。
技術分享圖片

java類文件是一個8位字節的二進制流。數據順序項存儲在沒有填充的類文件的相鄰的項目之間。沒有填充有助於保持緊湊的類文件,超過一個字節的數據是分成幾個連續的字節,出現在高位字節順序中。
就像java類可以包含不同數字的字段,方法,方法參數,局部變量等,java類文件也可以許多大小不同的項目或者數量從一個類文件到另一個地方。在類文件中,類文件的大小或者長度變長項先於實際的數據項,這允許類文件流解析從頭到尾,先是讀項目的大小然後再讀數據。

幻數

每個java類文件的前四個字節都是幻數,以0xCAFEBABE開頭。幻數使非java類文件更容易識別。如果一個文件不是以0xCAFEBABE開頭,那它絕不是一個java類文件。設計任意沒有在廣泛使用的任意數字作為一個幻數。當“java”被稱為“Oak”時,java類文件的幻數可以選擇過去式。帕特裏克?諾頓表示 最初的Java團隊的關鍵成員,之前曾說過關於這門語言幻數選擇Java名稱時。我們正在尋找一些有趣,獨特,容易記住。這只是一個巧合0 xcafebabe開頭,暗指可愛的咖啡師在皮特的咖啡,預示了Java名稱。”

主次版本號

第二個類文件的四個直接包含主次版本號。 隨著java技術的發展,新功能偶爾會被添加到java類文件的格式中。每次類文件格式的改變,版本號也會隨之改變。對java虛擬機而言,版本號的標示的格式需要遵循一個特定的類文件。Java虛擬機通常能夠負載類文件與給定的主版本號和一系列的次要版本號。Java虛擬機必須拒絕類超出它們的有效範圍的文件版本號。

常量池數和常量池

類文件中的幻數和版本號都是常量池。常量池包含常量定的類或者接口文件。如這些常量:字符串,final類型的變量,類名,方法名都存儲在常量池中。常量池被組織成一個條目列表。在一個計數條目列表中,常量池數優先於實際的列表,常量池。
在常量池中許多元素引用其它元素,和許多類文件中的常量池引用常量池中的元素。整個類文件,常量池條裏的元素被整數索引,它們的位置在常量池列表中。列表中的第一個元素的索引,第二個索引,等等。盡管沒有在常量池列表中的元素但是它的索引為0,包含在常量池數的常量池數為0 的元素中。例如,如果一個常量池列表包含14個元素(1到14的索引),那麽下一個常量池數為15。
每個常量池條目從一個字節標記開始,表明該類型的常量在那個列表中標記這個起始位置。一旦一個java迅即抓住並解析這個標記後,它就知道會發生什麽。
技術分享圖片

上面的表中,是展示的為每個標簽對應的表。表的名稱是由附加“_info”標簽的名字。例如表CONSTANT_Class標簽對應的表名稱是CONSTANT_Class_info。CONSTANT_Utf8_info表存儲壓縮的Unicode字符串形式。
在java程序動態鏈中 常量池扮演著重要的角色。除了字面常量,常量池也包含下面的類型的符號引用。

  • 類和接口的全限定名
  • 字段的名稱和描述符
  • 方法名稱和描述符
    一個字段是一個類或者接口的實例或者類變量。一個字段描述是一個字符,表示字段類型。方法描述是一個字符,表示該方法返回的類型的參數。常量池是完全限定的名稱和使用方法和字段描述符在運行時鏈接代碼在這個類或接口與其他類和接口的代碼和數據。類文件不包含信息的最終的內存布局組件,因此類、字段和方法不能直接引用類的字節碼文件。Java虛擬機解決任何引用的項目的實際地址在運行時常量池中的象征性參考。例如,字節碼指令,調用一個方法給常量池指數的符號引用調用的方法。

    訪問標誌

    前兩個字節在常量池後,訪問標誌,揭示幾項信息關於類文件中定義的類或者接口。首先,訪問標誌標誌是否是一個類或者接口。訪問標誌也表明修飾符所使用的類或者接口的聲明。也可以是抽象或者公共的類和接口。類可以是final類型的,盡管final類型的類不能是抽象的。接口不能是final來修飾。
    技術分享圖片

this_class

接下來的兩個字節是this_class項,一個在常量池的索引。常量池的入口位置this_class必須是是表CONSTANT_Class_info,它有兩部分:一個標簽,一個名字索引。這個標簽值是CONSTANT_Class。常量池項入口位置的名字索引將是包含類或者接口的完全限定名的表CONSTANT_Utf8_info。
this_class項提供類一個如何使用常量池。this_class項本身就是一個在常量池中的索引。當java虛擬機查找this_class常量池入口的位置時,它將發現通過標簽標示本身的條目CONSTANT_Class_info。java虛擬機知道CONSTANT_Class_info條目索引到常量池中,稱為名字索引,在它們的標簽後面。所以虛擬機查找name_index常量池入口的位置,應該在哪裏找到CONSTANT_Utf8_info條目包含類或接口的完全限定名稱
技術分享圖片

super_class

在類文件在this_class 是super_class的項目,另一個兩字節的索引到常量池中。常量池入口位置super_class將CONSTANT_Class_info條目指該類超類的完全限定名稱。在java程序中所有對象的基類都是java.lang.Object class,super_class常量池索引對每個類有效除了Object。對於Object類而言,它沒有super_class。接口的常量池入口位置的super_class是java.lang.Object。

接口數量和接口

組件super_class始於interfaces_count,超接口的數量計數直接在實現的類或者接口中定義該文件。立即計數接口是一個數組,其中包含一個索引到常量池中為每個超接口直接由這個類或者接口實現。每個超接口由常量池中的一個CONSTANT_Class_info項表示,指的是接口的完全限定名稱。唯一的直接超接口,那些出現在類的實現或者接口的擴展,出現在這個數組中。數組中的超接口出現在它們出現的順序(從左到右)實現或擴展。

字段數和字段

類文件中的接口組件是描述聲明這個類或者接口的字段。這個組件是從fields_count開始,一個數量計數的字段,包括類和實例變量。數是表variable-length field_info的列表,對應著每個字段。唯一的字段出現在字段列表中是那些被定義的類或接口中定義的文件。沒有字段從超類繼承或它的超接口出現在字段列表。

每個 field_info表顯示一個字段信息。表中包含字段名稱,描述符和修飾符。如果字段聲明為final類型,field_info表也揭示該字段的常量值。它的一些信息包含在field_info表中,常量池中包含的位置被稱為表。

方法數和方法

通過類或者接口聲明的方法描述在類文件中的字段。這個組件從methods_count開始,類或者接口中的雙字節方法數量。數只包括那些明確定義的類或接口的方法。

java class file