本篇文章為大家展示了.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供茫崖網(wǎng)站建設(shè)、茫崖做網(wǎng)站、茫崖網(wǎng)站設(shè)計(jì)、茫崖網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、茫崖企業(yè)網(wǎng)站模板建站服務(wù),十余年茫崖做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
這里先讓大家大致的看看.class文件和虛擬機(jī)指令的樣子,不會(huì)讓你有種“所愛(ài)隔山?!钡母杏X(jué)。
首先拋一個(gè)問(wèn)題,是不是只有Java語(yǔ)言編譯后的class文件才能在jvm中運(yùn)行,也就是說(shuō)其他的語(yǔ)言是否可以使用Java虛擬機(jī)作為媒介?答案是:不是,可以的;只要符合JVM文件結(jié)構(gòu)的規(guī)范,編譯后的文件均能運(yùn)行,比如scala語(yǔ)言.scala結(jié)尾文件,可以編譯為.class文件,可以在jvm中運(yùn)行,哈哈哈,這里寫(xiě)的好生硬。
如圖各種語(yǔ)言與JVM的愛(ài)恨情仇,只要你的語(yǔ)言經(jīng)過(guò)自己的編譯器,最終能得到一個(gè)JVM需要的.class文件,那么你就可以。
字節(jié)碼形態(tài)經(jīng)由Classloader加載變成運(yùn)行時(shí)形態(tài)(內(nèi)存中)。
java 剛剛誕生的口號(hào)“一次編寫(xiě),到處運(yùn)行",這是滿(mǎn)足開(kāi)發(fā)人員對(duì)沖破平臺(tái)限制渴望的實(shí)現(xiàn),這個(gè)很快就實(shí)現(xiàn)。然而設(shè)計(jì)者一開(kāi)始發(fā)布規(guī)范文檔的時(shí)候就是刻意把Java規(guī)范拆解成了《Java語(yǔ)言規(guī)范》和《Java虛擬機(jī)規(guī)范》,也就是說(shuō)他們對(duì)虛擬機(jī)的野心不止于Java語(yǔ)言,他們未來(lái)的目標(biāo)是沖破語(yǔ)言限制,現(xiàn)在也實(shí)現(xiàn)了,Scala,jRuby這些語(yǔ)言都可以運(yùn)行在Java虛擬機(jī)上面。隨著平臺(tái)(windows,linux,unix)基本穩(wěn)定,而語(yǔ)言日新月異,日后JAVA“語(yǔ)言無(wú)關(guān)”的優(yōu)勢(shì)可能會(huì)超過(guò)“平臺(tái)無(wú)關(guān)”的優(yōu)勢(shì)!
實(shí)現(xiàn)語(yǔ)言無(wú)關(guān)的關(guān)鍵就是虛擬機(jī)和字節(jié)碼存儲(chǔ)格式。可以理解成虛擬機(jī)給你提供一個(gè)接口,你只需要按照他指定的格式傳class文件給他,他便可以運(yùn)行你的代碼,所以關(guān)鍵就是這個(gè)class文件。虛擬機(jī)不關(guān)心你的項(xiàng)目使用什么語(yǔ)言進(jìn)行代碼實(shí)現(xiàn),最后你只需要按照他想要的class格式編譯成class文件傳給他,就可以成功運(yùn)行在虛擬機(jī)上面。我說(shuō)的夠清楚了吧老弟?
class 文件是一組以8位字節(jié)為基礎(chǔ)單位的二進(jìn)制流,中間沒(méi)有任何分隔符
,正是因?yàn)闆](méi)有任何分隔符所以class文件里面的數(shù)據(jù)項(xiàng)在順序和數(shù)量上面是嚴(yán)格限定的,每個(gè)字節(jié)的含義,長(zhǎng)度,先后順序,都不允許改變。具體class文件內(nèi)容看圖。
class文件采用的是一種類(lèi)似于C語(yǔ)言結(jié)構(gòu)體的偽結(jié)構(gòu)來(lái)存儲(chǔ)數(shù)據(jù),本質(zhì)就是一張表,如圖所示:
首先拋出一個(gè)問(wèn)題,JVM一開(kāi)始就是服務(wù)Java的,拿Java語(yǔ)言來(lái)舉例子,如果你是設(shè)計(jì)者,你將你的Java源碼編譯成class文件,你會(huì)怎么設(shè)計(jì)這個(gè)class文件?
思路:
轉(zhuǎn)換成容易理解的實(shí)現(xiàn),知道Java的,一般都知道xml文件,一個(gè)JavaBean完全可以轉(zhuǎn)化為用xml這種描述性語(yǔ)言來(lái)表示,原因是xml是指定好了協(xié)議,你的Java要變成 xml 就要按照我的協(xié)議來(lái)辦事,用 xml 描述一個(gè)學(xué)生對(duì)象如下:
協(xié)議的話其實(shí)就很能理解,你的class是一個(gè)十六進(jìn)制文件,那么就必須制定自己的協(xié)議啊,使得你的十六進(jìn)制描述的東西可以轉(zhuǎn)化為 JVM 可以理解的虛擬機(jī)指令,也就是你的 “xx” 這幾個(gè)字母是為了告訴虛擬機(jī)干啥,“oo”這幾個(gè)字母是想告訴虛擬機(jī)干啥,“xxoo”又是表示啥,這里先看看實(shí)際的JVM指令以及和class文件對(duì)應(yīng)關(guān)系(現(xiàn)在的 JVM 指令有255個(gè)大約)
轉(zhuǎn)化:
有了思路就好辦了,轉(zhuǎn)化一下,將 JAVA 源碼轉(zhuǎn)化為 CLASS 文件,來(lái)看看具體怎么轉(zhuǎn)化:
再來(lái)回顧一下class文件內(nèi)容:
無(wú)符號(hào)數(shù)
屬于基本數(shù)據(jù)類(lèi)型(Java類(lèi)中也有基本數(shù)據(jù)類(lèi)型),以 u1,u2,u4,u8這種來(lái)代表1個(gè)字節(jié),2個(gè)字節(jié),4個(gè)字節(jié),8個(gè)字節(jié)的無(wú)符號(hào)數(shù),可以用來(lái)描述數(shù)字,索引引用,數(shù)量值或者字符串值。
表
就跟Java類(lèi)中的對(duì)象引用類(lèi)型一樣,對(duì)象屬性可以是基本數(shù)據(jù)類(lèi)型(對(duì)應(yīng)U1,U2無(wú)符號(hào)數(shù)),也可以是其他的對(duì)象(對(duì)應(yīng)其他的表),Java工程項(xiàng)目中參數(shù)實(shí)體通常以"_Param"結(jié)尾(class文件的表都習(xí)慣以“_info”結(jié)尾)上述內(nèi)容就是.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)頁(yè)名稱(chēng):.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的
標(biāo)題鏈接:http://chinadenli.net/article6/gopjog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、網(wǎng)站維護(hù)、服務(wù)器托管、網(wǎng)站制作、企業(yè)建站、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)