更新時(shí)間:2022-09-19 11:21:59 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2828次
相信大家對(duì)Java字節(jié)碼文件多少都有一些了解,還不是很清楚的小伙伴可以看看字節(jié)碼文件的擴(kuò)展名.class介紹。我們?cè)谑褂肐DEA工具編寫(xiě)java代碼時(shí),當(dāng)執(zhí)行程序時(shí),IDEA會(huì)使用JDK幫我們執(zhí)行編譯命令,在target目錄下生成對(duì)應(yīng)的.class文件。
編譯前:
執(zhí)行程序后:
這一步操作,就是將.java文件編譯成JVM可執(zhí)行的.class文件,也叫做字節(jié)碼文件。
在 Java 中,JVM 可以執(zhí)行的代碼就叫做字節(jié)碼(即擴(kuò)展名為 .class 的文件),它不面向任何特定的處理器,只面向虛擬機(jī)。Java 語(yǔ)言通過(guò)字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題并且保留了解釋型語(yǔ)言可移植的特點(diǎn),而通過(guò)即時(shí)編譯器(jit)又有編譯型語(yǔ)言執(zhí)行效率高的特點(diǎn)。所以 Java 程序運(yùn)行時(shí)比較高效。Java通過(guò)字節(jié)碼文件和虛擬機(jī)jvm之間的關(guān)系,做到了平臺(tái)無(wú)關(guān)性,一次編譯,各平臺(tái)都可運(yùn)行。
能在Java虛擬機(jī)上運(yùn)行的語(yǔ)言,不僅僅只有Java,比如:Groovy、Scala 等語(yǔ)言都是運(yùn)行在 Java 虛擬機(jī)之上。下圖展示了不同的語(yǔ)言被不同的編譯器編譯成.class文件最終運(yùn)行在 Java 虛擬機(jī)之上。
使用winhex打開(kāi)后如下
Java源文件在被Java編譯器編譯之后, 每個(gè)類(或者接口)都單獨(dú)占據(jù)一個(gè)class文件, 并且類中的所有信息都會(huì)在class文件中有相應(yīng)的描述, 由于class文件很靈活, 它甚至比Java源文件有著更強(qiáng)的描述能力。
class文件中的信息是一項(xiàng)一項(xiàng)排列的, 每項(xiàng)數(shù)據(jù)都有它的固定長(zhǎng)度, 有的占一個(gè)字節(jié), 有的占兩個(gè)字節(jié), 還有的占四個(gè)字節(jié)或8個(gè)字節(jié), 數(shù)據(jù)項(xiàng)的不同長(zhǎng)度分別用u1, u2, u4, u8表示, 分別表示一種數(shù)據(jù)項(xiàng)在class文件中占據(jù)一個(gè)字節(jié), 兩個(gè)字節(jié), 4個(gè)字節(jié)和8個(gè)字節(jié)。 可以把u1, u2, u3, u4看做class文件數(shù)據(jù)項(xiàng)的“類型”
一個(gè)典型的class文件分為:MagicNumber,Version,Constant_pool,Access_flag,This_class,Super_class,Interfaces,F(xiàn)ields,Methods 和Attributes這十個(gè)部分,用一個(gè)數(shù)據(jù)結(jié)構(gòu)可以表示如下:
以上就是關(guān)于“Java字節(jié)碼文件詳解”的介紹,大家如果感興趣,不妨來(lái)關(guān)注一下動(dòng)力節(jié)點(diǎn)的Java在線學(xué)習(xí),里面的課程內(nèi)容從入門到精通,細(xì)致全面,適合沒(méi)有基礎(chǔ)的小伙伴學(xué)習(xí),希望對(duì)大家能夠有所幫助哦。
相關(guān)閱讀
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)