目錄
字節(jié)碼
Java字節(jié)碼和二進制文件
字節(jié)碼文件、反編譯和解析
機器碼
字節(jié)碼
Java字節(jié)碼和二進制文件
Java字節(jié)碼文件(.class):對Java源文件(.java)編譯后生成的二進制文件。二進制文件不單單包含只由0、1二進制組成的文件,還包括四、八、十六進職等。Java字節(jié)碼文件是十六進制的二進制文件。
字節(jié)碼文件、反編譯和解析
對字節(jié)碼文件反編譯后會生成類似Java源文件(.java)的代碼,idea自帶反編譯功能,所以點擊class文件可以直接閱讀。
真正的class文件如下

使用Binary Viewer可以打開
起始內(nèi)容為CafeBaby,稱之為魔術(shù)(magicnumber),所有能被jvm識別的字節(jié)碼文件都必須使用CafeBaby作為起始內(nèi)容。
javap命令:大多數(shù)人認為javap是反編譯,其實是一種對字節(jié)碼的解析。參考oracle的官方說明
意思是說對class文件進行反匯編。
三種方式解析字節(jié)碼:
控制臺輸入javap -v ***.class
安裝jclasslib bytecode viewer
idea安裝jclasslib bytecode插件
解析結(jié)果如下

這個文件與上述反編譯文件的不同在于,它詳細解釋了jvm對代碼的執(zhí)行流程,例如何時從內(nèi)存讀出數(shù)據(jù),何時把新方法壓入棧。而反編譯的類java文件還是從邏輯角度出發(fā),是你編寫代碼時的邏輯順序(即原始java文件)。
機器碼
CPU機器碼
只有CPU能夠讀懂的一組0、1二進制數(shù),jvm對字節(jié)碼轉(zhuǎn)譯后才會變成機器碼,java的跨平臺性就體現(xiàn)在不依賴CPU等具體硬件,一切底層依賴交給jvm處理。