中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的

本篇文章為大家展示了.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供茫崖網(wǎng)站建設(shè)、茫崖做網(wǎng)站、茫崖網(wǎng)站設(shè)計、茫崖網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、茫崖企業(yè)網(wǎng)站模板建站服務(wù),十余年茫崖做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

相關(guān)虛擬機的命令

  1. 編寫Java源碼
.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
Java源碼
  1. 編譯指令 javac xxx.java,得到.class文件
  2. hexdump -C filename可以查看二進制文件
.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
.class 二進制文件
  1. 編譯后使用 javap -c 類名, 得到.class文件對應(yīng)的虛擬機指令 class文件對應(yīng)的虛擬機指令
.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
class文件對應(yīng)的虛擬機指令表

這里先讓大家大致的看看.class文件和虛擬機指令的樣子,不會讓你有種“所愛隔山?!钡母杏X。

 

Class文件產(chǎn)生背景及重要地位

 

【問題】只有Java語言編譯后的class文件才能在 JVM 里面跑嗎?

首先拋一個問題,是不是只有Java語言編譯后的class文件才能在jvm中運行,也就是說其他的語言是否可以使用Java虛擬機作為媒介?答案是:不是,可以的;只要符合JVM文件結(jié)構(gòu)的規(guī)范,編譯后的文件均能運行,比如scala語言.scala結(jié)尾文件,可以編譯為.class文件,可以在jvm中運行,哈哈哈,這里寫的好生硬。

.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
各種語言與JVM的愛恨情仇

如圖各種語言與JVM的愛恨情仇,只要你的語言經(jīng)過自己的編譯器,最終能得到一個JVM需要的.class文件,那么你就可以。

 

class文件的地位

  • Source: 源碼
  • Class: 字節(jié)碼
  • Runtime: 運行時

字節(jié)碼形態(tài)經(jīng)由Classloader加載變成運行時形態(tài)(內(nèi)存中)。

java 剛剛誕生的口號“一次編寫,到處運行",這是滿足開發(fā)人員對沖破平臺限制渴望的實現(xiàn),這個很快就實現(xiàn)。然而設(shè)計者一開始發(fā)布規(guī)范文檔的時候就是刻意把Java規(guī)范拆解成了《Java語言規(guī)范》和《Java虛擬機規(guī)范》,也就是說他們對虛擬機的野心不止于Java語言,他們未來的目標是沖破語言限制,現(xiàn)在也實現(xiàn)了,Scala,jRuby這些語言都可以運行在Java虛擬機上面。隨著平臺(windows,linux,unix)基本穩(wěn)定,而語言日新月異,日后JAVA“語言無關(guān)”的優(yōu)勢可能會超過“平臺無關(guān)”的優(yōu)勢!

實現(xiàn)語言無關(guān)的關(guān)鍵就是虛擬機和字節(jié)碼存儲格式??梢岳斫獬商摂M機給你提供一個接口,你只需要按照他指定的格式傳class文件給他,他便可以運行你的代碼,所以關(guān)鍵就是這個class文件。虛擬機不關(guān)心你的項目使用什么語言進行代碼實現(xiàn),最后你只需要按照他想要的class格式編譯成class文件傳給他,就可以成功運行在虛擬機上面。我說的夠清楚了吧老弟?

 

Class 類文件結(jié)構(gòu)設(shè)計解析

class 文件是一組以8位字節(jié)為基礎(chǔ)單位的二進制流,中間沒有任何分隔符,正是因為沒有任何分隔符所以class文件里面的數(shù)據(jù)項在順序和數(shù)量上面是嚴格限定的,每個字節(jié)的含義,長度,先后順序,都不允許改變。具體class文件內(nèi)容看圖。

class文件采用的是一種類似于C語言結(jié)構(gòu)體的偽結(jié)構(gòu)來存儲數(shù)據(jù),本質(zhì)就是一張表,如圖所示:

.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
.class 二進制文件
.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
class文件對應(yīng)內(nèi)容
 

【問題】你會怎么設(shè)計class文件?

首先拋出一個問題,JVM一開始就是服務(wù)Java的,拿Java語言來舉例子,如果你是設(shè)計者,你將你的Java源碼編譯成class文件,你會怎么設(shè)計這個class文件?

思路:轉(zhuǎn)換成容易理解的實現(xiàn),知道Java的,一般都知道xml文件,一個JavaBean完全可以轉(zhuǎn)化為用xml這種描述性語言來表示,原因是xml是指定好了協(xié)議,你的Java要變成 xml 就要按照我的協(xié)議來辦事,用 xml 描述一個學(xué)生對象如下:

.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
xml 表示的Java對象

協(xié)議的話其實就很能理解,你的class是一個十六進制文件,那么就必須制定自己的協(xié)議啊,使得你的十六進制描述的東西可以轉(zhuǎn)化為 JVM 可以理解的虛擬機指令,也就是你的 “xx” 這幾個字母是為了告訴虛擬機干啥,“oo”這幾個字母是想告訴虛擬機干啥,“xxoo”又是表示啥,這里先看看實際的JVM指令以及和class文件對應(yīng)關(guān)系(現(xiàn)在的 JVM 指令有255個大約)

.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
JVM指令表

轉(zhuǎn)化:有了思路就好辦了,轉(zhuǎn)化一下,將 JAVA 源碼轉(zhuǎn)化為 CLASS 文件,來看看具體怎么轉(zhuǎn)化:

  1. 一個Java類對應(yīng)一個class文件(有可能是多個,如果類里面有內(nèi)部類),里面有哪些東西?肯定不能丟東西嘛,這是最基本的要求,如果人家明明寫的是“你綠了我嗎”,你給搞成了“你綠了我”,那這心情起伏還是蠻大的哈。
  2. Java類里面的東西你怎么剖析,怎么設(shè)計存儲?
  • 簡單解剖一下,class文件可能是Java中的class類,也可能是接口,一個class所表示的里面還可能不止一個類和接口,得區(qū)分一下吧?來,敲黑板劃重點,大膽設(shè)計就是接口類型集合,普通類集合,還不止一個?再加兩個字段接口個數(shù),類個數(shù),一切都是這么的完美,往class文件里面找,我去都能找到,OK,我是天才,下一個。
  • Java里面有屬性,有方法,有常量,有字段,怎么破?繼續(xù)嘛,集合搞起來,個數(shù)存起來,最終得到了上面圖里面的表結(jié)構(gòu)的class文件。

再來回顧一下class文件內(nèi)容:.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的

  1. Java類里面有什么東西,class文件應(yīng)該存儲些什么東西?
  • 兩種數(shù)據(jù)類型:無符號數(shù)和表     無符號數(shù)屬于基本數(shù)據(jù)類型(Java類中也有基本數(shù)據(jù)類型),以 u1,u2,u4,u8這種來代表1個字節(jié),2個字節(jié),4個字節(jié),8個字節(jié)的無符號數(shù),可以用來描述數(shù)字,索引引用,數(shù)量值或者字符串值。     就跟Java類中的對象引用類型一樣,對象屬性可以是基本數(shù)據(jù)類型(對應(yīng)U1,U2無符號數(shù)),也可以是其他的對象(對應(yīng)其他的表),Java工程項目中參數(shù)實體通常以"_Param"結(jié)尾(class文件的表都習(xí)慣以“_info”結(jié)尾)
  • 上圖中的順序,就是Class文件嚴格要求的順序
  • 各個計數(shù)器主要是用來描述表里面數(shù)據(jù)個數(shù),例如方法計數(shù)器的值是methods_count,代表方法表method——info里面有“methods_count”個方法
  • 整理一下,表結(jié)構(gòu)用C語言表示類似下面的偽代碼(忽略idea報錯的紅線)
.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的  
class文件代碼表示

上述內(nèi)容就是.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁名稱:.class文件結(jié)構(gòu)以及.class文件的身份地位是怎么樣的
標題鏈接:http://www.rwnh.cn/article6/gopjog.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號、網(wǎng)站維護服務(wù)器托管、網(wǎng)站制作、企業(yè)建站云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管
安阳市| 静乐县| 疏勒县| 宁化县| 保康县| 松桃| 确山县| 周口市| 康保县| 恭城| 岳普湖县| 齐河县| 南溪县| 凤庆县| 光泽县| 谢通门县| 滦南县| 从化市| 高台县| 巴楚县| 大城县| 高青县| 高淳县| 建宁县| 灵武市| 清原| 射阳县| 壤塘县| 宜章县| 高陵县| 永济市| 衢州市| 英超| 双桥区| 铁岭县| 乌什县| 溧阳市| 龙口市| 云林县| 绍兴市| 三明市|