您好,登錄后才能下訂單哦!
本篇文章為大家展示了.class文件結構以及.class文件的身份地位是怎么樣的,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
這里先讓大家大致的看看.class文件和虛擬機指令的樣子,不會讓你有種“所愛隔山海”的感覺。
首先拋一個問題,是不是只有Java語言編譯后的class文件才能在jvm中運行,也就是說其他的語言是否可以使用Java虛擬機作為媒介?答案是:不是,可以的;只要符合JVM文件結構的規范,編譯后的文件均能運行,比如scala語言.scala結尾文件,可以編譯為.class文件,可以在jvm中運行,哈哈哈,這里寫的好生硬。
如圖各種語言與JVM的愛恨情仇,只要你的語言經過自己的編譯器,最終能得到一個JVM需要的.class文件,那么你就可以。
字節碼形態經由Classloader加載變成運行時形態(內存中)。
java 剛剛誕生的口號“一次編寫,到處運行",這是滿足開發人員對沖破平臺限制渴望的實現,這個很快就實現。然而設計者一開始發布規范文檔的時候就是刻意把Java規范拆解成了《Java語言規范》和《Java虛擬機規范》,也就是說他們對虛擬機的野心不止于Java語言,他們未來的目標是沖破語言限制,現在也實現了,Scala,jRuby這些語言都可以運行在Java虛擬機上面。隨著平臺(windows,linux,unix)基本穩定,而語言日新月異,日后JAVA“語言無關”的優勢可能會超過“平臺無關”的優勢!
實現語言無關的關鍵就是虛擬機和字節碼存儲格式。可以理解成虛擬機給你提供一個接口,你只需要按照他指定的格式傳class文件給他,他便可以運行你的代碼,所以關鍵就是這個class文件。虛擬機不關心你的項目使用什么語言進行代碼實現,最后你只需要按照他想要的class格式編譯成class文件傳給他,就可以成功運行在虛擬機上面。我說的夠清楚了吧老弟?
class 文件是一組以8位字節為基礎單位的二進制流,中間沒有任何分隔符
,正是因為沒有任何分隔符所以class文件里面的數據項在順序和數量上面是嚴格限定的,每個字節的含義,長度,先后順序,都不允許改變。具體class文件內容看圖。
class文件采用的是一種類似于C語言結構體的偽結構來存儲數據,本質就是一張表,如圖所示:
首先拋出一個問題,JVM一開始就是服務Java的,拿Java語言來舉例子,如果你是設計者,你將你的Java源碼編譯成class文件,你會怎么設計這個class文件?
思路:
轉換成容易理解的實現,知道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文件的身份地位是怎么樣的,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。