JVM 進階 | Java字節碼

點擊 blog便可查看原文和更多的文章,歡迎star。

什麼是Java字節碼

img

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);
    }
}

image-20201130215033695

而後執行 javac HelloByteCode.java ,這樣就的到了HelloByteCode.class文件,它就是咱們所說的字節碼文件。編譯完成後咱們先用文本工具打開(.class)文件看下:工具

image-20201130220049549

魔數

打開後是一堆十六進制數,能夠看到上圖中用藍色框標記起來的cafe babe就是魔數,全部的字節碼文件都是以這個爲開頭的,魔數的固定值爲:0xCAFEBABE,魔數放在文件的開頭是爲了讓jvm識別這個文件是否是一個.class文件,若是不是就不會進行下一步的操做。spa

版本號

一樣仍是上邊的字節碼圖,黃色框圈起來的是版本號,0000 0037,0000爲次版本號,0037位主版本,次版本號轉化爲十進制爲0,主版本號轉化爲十進制爲55,經過Oracle官網查詢可知,55對應的版本號是jdk 11。插件

查看反編譯

接下來使用 javap -v -l -c HelloByteCode 命令對(.class)文件進行反編譯。具體每一塊是幹什麼我在圖中詳細的標出來了,你們能夠仔細看下面的圖片。就不一一介紹了,主要包括版本號、訪問標誌、接口信息、常量池、方法描述、操做指令、行號表、本地變量表(圖中沒有體現出來,你們能夠用命令將本地變量表輸出出來本身看下)3d

相關文章
相關標籤/搜索