目錄java
這裏先讓你們大體的看看.class文件和虛擬機指令的樣子,不會讓你有種「所愛隔山海」的感受。linux
首先拋一個問題,是否是隻有Java語言編譯後的class文件才能在jvm中運行,也就是說其餘的語言是否可使用Java虛擬機做爲媒介? 答案是:不是,能夠的;只要符合JVM文件結構的規範,編譯後的文件均能運行,好比scala語言.scala結尾文件,能夠編譯爲.class文件,能夠在jvm中運行,哈哈哈,這裏寫的好生硬。web
如圖各類語言與JVM的愛恨情仇,只要你的語言通過本身的編譯器,最終能獲得一個JVM須要的.class文件,那麼你就能夠。windows
字節碼形態經由Classloader加載變成運行時形態(內存中)。jvm
java 剛剛誕生的口號「一次編寫,處處運行",這是知足開發人員對衝破平臺限制渴望的實現,這個很快就實現。然而設計者一開始發佈規範文檔的時候就是刻意把Java規範拆解成了《Java語言規範》和《Java虛擬機規範》,也就是說他們對虛擬機的野心不止於Java語言,他們將來的目標是衝破語言限制,如今也實現了,Scala,jRuby這些語言均可以運行在Java虛擬機上面。隨着平臺(windows,linux,unix)基本穩定,而語言突飛猛進,往後JAVA「語言無關」的優點可能會超過「平臺無關」的優點!編輯器
實現語言無關的關鍵就是虛擬機和字節碼存儲格式。能夠理解成虛擬機給你提供一個接口,你只須要按照他指定的格式傳class文件給他,他即可以運行你的代碼,因此關鍵就是這個class文件。虛擬機不關心你的項目使用什麼語言進行代碼實現,最後你只須要按照他想要的class格式編譯成class文件傳給他,就能夠成功運行在虛擬機上面。我說的夠清楚了吧老弟?ide
class 文件是一組以8位字節爲基礎單位的二進制流,中間沒有任何分隔符
,正是由於沒有任何分隔符因此class文件裏面的數據項在順序和數量上面是嚴格限定的,每一個字節的含義,長度,前後順序,都不容許改變。具體class文件內容看圖。idea
class文件採用的是一種相似於C語言結構體的僞結構來存儲數據,本質就是一張表,如圖所示:spa
首先拋出一個問題,JVM一開始就是服務Java的,拿Java語言來舉例子,若是你是設計者,你將你的Java源碼編譯成class文件,你會怎麼設計這個class文件?
scala
思路:
轉換成容易理解的實現,知道Java的,通常都知道xml文件,一個JavaBean徹底能夠轉化爲用xml這種描述性語言來表示,緣由是xml是指定好了協議,你的Java要變成 xml 就要按照個人協議來辦事,用 xml 描述一個學生對象以下:
協議的話其實就很能理解,你的class是一個十六進制文件,那麼就必須制定本身的協議啊,使得你的十六進制描述的東西能夠轉化爲 JVM 能夠理解的虛擬機指令,也就是你的 「xx」 這幾個字母是爲了告訴虛擬機幹啥,「oo」這幾個字母是想告訴虛擬機幹啥,「xxoo」又是表示啥,這裏先看看實際的JVM指令以及和class文件對應關係(如今的 JVM 指令有255個大約)
轉化:
有了思路就好辦了,轉化一下,將 JAVA 源碼轉化爲 CLASS 文件,來看看具體怎麼轉化:
再來回顧一下class文件內容:
無符號數
屬於基本數據類型(Java類中也有基本數據類型),以 u1,u2,u4,u8這種來表明1個字節,2個字節,4個字節,8個字節的無符號數,能夠用來描述數字,索引引用,數量值或者字符串值。
表
就跟Java類中的對象引用類型同樣,對象屬性能夠是基本數據類型(對應U1,U2無符號數),也能夠是其餘的對象(對應其餘的表),Java工程項目中參數實體一般以"_Param"結尾(class文件的表都習慣以「_info」結尾)
完結撒花了?這裏我是從宏觀上講解了下.class文件,下期進行.class類文件結構詳細解析,以及字節碼指令的剖析,本篇只是個開胃菜,下一篇內容纔是主菜。 另外Java類在JVM裏面的生命週期能夠看我公衆號上一篇內容