點擊 blog便可查看原文和更多的文章,歡迎star。
Java字節碼是由(.Java)文件編譯成(.class)的文件。之因此叫字節碼是由於(.class)文件是由十六進制組成的。而JVM以兩個十六進制值爲一組,即以字節爲單位進行讀取。java之因此可以作到一次編譯、處處運行,就是由於不一樣的平臺都會編譯成相同的(.class)文件,因此才能在不一樣的平臺執行。這種跨平臺執行的實現,極大的提升了開發和維護的成本。java
查看字節碼有不少種方法,網上也有一些插件能夠查看。咱們這裏直說一種就是經過javap命令來查看。git
先經過javap -help來查看下這個命令怎麼使用:github
用法: javap <options> <classes> 其中, 可能的選項包括: -? -h --help -help 輸出此幫助消息 -version 版本信息 -v -verbose 輸出附加信息 -l 輸出行號和本地變量表 -public 僅顯示公共類和成員 -protected 顯示受保護的/公共類和成員 -package 顯示程序包/受保護的/公共類 和成員 (默認) -p -private 顯示全部類和成員 -c 對代碼進行反彙編 -s 輸出內部類型簽名 -sysinfo 顯示正在處理的類的 系統信息 (路徑, 大小, 日期, MD5 散列) -constants 顯示最終常量 --module <模塊>, -m <模塊> 指定包含要反彙編的類的模塊 --module-path <路徑> 指定查找應用程序模塊的位置 --system <jdk> 指定查找系統模塊的位置 --class-path <路徑> 指定查找用戶類文件的位置 -classpath <路徑> 指定查找用戶類文件的位置 -cp <路徑> 指定查找用戶類文件的位置 -bootclasspath <路徑> 覆蓋引導類文件的位置
接下來咱們定義一個簡單的類jvm
/** * @author: lixiaoshuang * @create: 2020-11-30 19:57 **/ public class HelloByteCode { public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; System.out.println(c); } }
而後執行 javac HelloByteCode.java ,這樣就的到了HelloByteCode.class文件,它就是咱們所說的字節碼文件。編譯完成後咱們先用文本工具打開(.class)文件看下:工具
打開後是一堆十六進制數,能夠看到上圖中用藍色框標記起來的cafe babe就是魔數,全部的字節碼文件都是以這個爲開頭的,魔數的固定值爲:0xCAFEBABE,魔數放在文件的開頭是爲了讓jvm識別這個文件是否是一個.class文件,若是不是就不會進行下一步的操做。spa
一樣仍是上邊的字節碼圖,黃色框圈起來的是版本號,0000 0037,0000爲次版本號,0037位主版本,次版本號轉化爲十進制爲0,主版本號轉化爲十進制爲55,經過Oracle官網查詢可知,55對應的版本號是jdk 11。插件
接下來使用 javap -v -l -c HelloByteCode 命令對(.class)文件進行反編譯。具體每一塊是幹什麼我在圖中詳細的標出來了,你們能夠仔細看下面的圖片。就不一一介紹了,主要包括版本號、訪問標誌、接口信息、常量池、方法描述、操做指令、行號表、本地變量表(圖中沒有體現出來,你們能夠用命令將本地變量表輸出出來本身看下)3d