」一次編寫,到處運行「,這個是Java程序的一大優點,其平臺無關性的理想最終操做系統之上的一個應用層即Java虛擬機來實現的。Java虛擬機能夠載入一種與平臺無關的字節碼文件(ByteCode),即Class文件。這個地方,咱們要注意Java虛擬機不和包括Java在類的任何語言綁定,它只與「Class文件」這種特定的二進制文件格式所關聯,Class文件中,包含了Java虛擬機指令集和符號以及若干其餘輔助信息。現在,除了Java代碼能夠經過Javac編譯器編譯成字節碼文件文件以外,JRuby代碼也能夠經過jrubyc編譯器編譯成字節碼文件,Groovy代碼也能夠經過groovyc編譯器編譯成字節碼文件。所以,Java虛擬機不單單是能夠執行Java語言的。ruby
Class文件,是一組以8個字節爲基礎單元的二進制流,各個構成項徹底嚴格按照順序緊湊的排列在Class文件中,中間沒有任何分隔符,沒有空隙,當須要8個字節以上的空間的數據項的時候,則會按照高位在前的方式分割成若干個8位字節進行存儲。this
Class文件中的包括兩張數據類型,無符號數和表,無符號數,以u1,u2,u4,u8來分別表明1個字節、2個字節、4個字節、8個字節,無符號數能夠用來描述數字、索引引用、數量值、或者按照UTF-8編碼構成的字符串值;表是由多個無符號或者其餘數據項的複合數據類型,整個Class文件採用相似於c語言的結構體的僞結構體來存儲數據。編碼
Class文件結構以下spa
類型 | 名稱 | 數量 |
u4 | magic | 1 |
minor_version | ||
major_version | ||
constant_pool_count | ||
constant_pool | ||
access_flag | ||
this_class | ||
super_class | ||
interfaces_count | ||
interfaces | ||
fields_count | ||
fields | ||
methods_count | ||
methods | ||
attributes_count | ||
attributes |