java 解析二进制_Java二进制Class文件格式解析
一、Java Class文件是什么
《The JavaTM Virtual Machine Specification》(Second Edtion)中有表述:Java Class文件由8位字節(jié)流組成,所有的16位、32位和64位數據分別通過讀入2個、4個和8個字節(jié)來構造,多字節(jié)數據總是按照Big-endian順序來存放,即高位字節(jié)在前(放在低地址)。每個Class文件都包含且僅包含一個Java類型(類或者接口)。
或許,《The JavaTM Virtual Machine Specification》中的表述不夠明確,那么我們可以參考一下《Inside the Java Virtual Machine》(Second Edtion)中的表述:Java Class文件特指以.class為后綴名的Java虛擬機可裝載的文件。
分析一下兩者的表述,我覺得都不夠全面、不夠明確。我是這么定義的:Java Class文件就是指符合特定格式的字節(jié)流組成的二進制文件。這個特定的格式就是指第二節(jié)要討論的Class文件格式,亦即在《The JavaTM Virtual Machine Specification》中定義的Class文件格式。從另一個角度來說,這個特定格式就是指JVM能夠識別、能夠裝載的格式。為什么這么說呢?因為JVM在裝載class文件時,要進行class文件驗證,以保證裝載的class文件內容符合正確的內部結構。這個內部結構指的就是這個特定格式,只要是符合這個特定格式的Class文件都是合法的、規(guī)范的Class文件,都是JVM能夠裝載的Class文件。如果覺得這樣的表述還是不夠明確,我只能建議你讀完這篇文章之后再回頭來理解看看了J
為了討論方便,在下文中將對這兩個參考資料做個簡記:
1)《The Java Virtual Machine Specification》(Second Edtion)簡記為《JVM Spec》(2nded)。
2)《Inside the Java Virtual Machine》(Second Edtion) 簡記為《Inside JVM》(2nded)。
二、Java Class文件的格式
在講Class文件的格式之前,要介紹三個概念:
1)數據類型:《JVM Spec》(2nded)中指出,Java Class文件的數據用自己定義的一個數據類型集來表示,即u1,u2,u4,分別用于表示一個無符號類型的、占1,2,4個字節(jié)的數據。在《Inside JVM》(2nded)一書中,作者把這個數據類型集稱之為Class文件的基本類型,本人覺得比較形象,便于理解。所以,在本文中,我們也用基本類型來表示Java Class文件的數據。
2)表:根據《JVM Spec》(2nded)中的定義,表(table)由項(定義見3)組成,用于幾種Class文件結構中。《JVM Spec》(2nded)中指出,Java Class文件格式用一個類似于C結構的記號編寫的偽結構來表示。這個偽結構指的就是這里的表,例如下面的ClassFile表就是這種偽結構的一個典型例子,下文中所有的表都是指這種偽結構的表。表的大小是可變的,這是因為它的組成部分項是可變的。注意;這里的可變是針對Class層次而言的,即在不同的Class文件中該項的大小可能不一樣的,但是對于每一個具體的Class文件來說,這個項的大小又是一定的,因而這個表的大小也是一定的。那么,項為什么是可變的呢?請看下面的分析。
3)項:描述Java Class文件格式的結構的內容稱為項(items)。每個項都有自己的類型和名稱。項的類型可能是基本類型,也可能是一個表的名字,這種項都是一些數組項。數組項的每一個元素都是一個表,這個表同頂層的ClassFile表一樣,也都是一種偽結構,也都是由一些項構成的,而且這些表不一定是同一種格式的,因此數組項也可以看作一個可變大小的結構流J。這些表對于該數組項來說就是子項,當然子項可能還有子項(目前子項的深度最多就兩層)。項的名稱,沒有什么好說的,就是《JVM Spec》(2nded)中指定的一些名稱。另外,項也是有大小的,對于沒有子項的項來說,其大小是固定的;對于有子項的項來說,其大小是可變的。在一個具體的Class文件中,一個可變項(數組)的大小都會在其前一項中指定,為什么會是這樣的呢?因為《JVM Spec》(2nded)中就是這么定義的!在Class文件中,每個項按規(guī)范中定義好的順序存儲在Class文件中,相鄰的項之間沒有任何間隔,連續(xù)的項(數組)也是按順序存儲,不進行填充或者對齊,這樣可以使Class文件緊湊。
好了,我想這三個概念我已經解釋地比較清楚了,下面開始正式解析Class文件的格式。
首先要來解析一下ClassFile表結構,這是《JVM Spec》(2nded)中定義的Class文件最外層的結構,換言之,就是Class文件的格式。
ClassFile表結構
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_Class;
u2 super_Class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
31/3123>
總結
以上是生活随笔為你收集整理的java 解析二进制_Java二进制Class文件格式解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 舍掉LCD!Redmi Note 12
- 下一篇: 19年诺基亚830还可以做什么用(Cor