Java之.class文件與字節碼文件

1. JVM運行數據區概述

.class與字節碼bytecode

  • .class: 是指文件擴展名稱爲.class的文件,表示由java源程序經過java編譯器編譯而成且由JVM執行的二進制文件,因此可以通過擁有一份.class文件在不同的操作系統平臺上的JVM執行,實現跨平臺運行的特性
  • 字節碼bytecode: 簡單說不是文件,而是JVM操作的指令格式,通常我們通過javap -c -v xx.class生成的文件稱爲字節碼文件,是屬於可閱讀的字節碼指令文件,能夠讓我們清楚地知道java文件編譯成.class文件之後顯示的執行指令,便於程序員理解jvm的相關的知識

.class文件與字節碼文件格式

  • .class文件(16進制文件)
    在這裏插入圖片描述
  • 字節碼文件(可閱讀的指令文件)
    在這裏插入圖片描述
2. .class文件結構與字節碼

.class文件結構

  • 幻數

    • 類文件的四個字節表頭0xCAFEBABE
      在這裏插入圖片描述
  • 類文件格式的版本

    • 類文件的次要和主要版本
    • jdk的主要版本如下
      Java SE 14 = 58 (0x3A hex),
      Java SE 13 = 57 (0x39 hex),
      Java SE 12 = 56 (0x38 hex),
      Java SE 11 = 55 (0x37 hex),
      Java SE 10 = 54 (0x36 hex),[3]
      Java SE 9 = 53 (0x35 hex),[4]
      Java SE 8 = 52 (0x34 hex),
      Java SE 7 = 51 (0x33 hex),
      Java SE 6.0 = 50 (0x32 hex),
      Java SE 5.0 = 49 (0x31 hex),
      
      在這裏插入圖片描述
      表示0x0034當前使用jdk版本爲jdk8
  • 常量池: 類文件的常量池

  • 訪問標識: 類文件的訪問標識, abstract, static,等等

  • 當前的類名稱,class name

  • 當前父類的名稱, super class name

  • 當前類的任何接口

  • 當前類的字段信息

  • 當前類的方法信息

  • 當前類的屬性信息

字節碼指令

  • 指令類別
    • 存儲指令 (例如:aload_0, istore)
    • 算術與邏輯指令 (例如: ladd, fcmpl)
    • 類型轉換指令 (例如:i2b, d2i)
    • 對象創建與操作指令 (例如:new, putfield)
    • 堆棧操作指令 (例如:swap, dup2)
    • 控制轉移指令 (例如:ifeq, goto)
    • 方法調用與返回指令 (例如:invokespecial, areturn)
  • 指令操作前後綴與數據類型
    • i 整數
    • l 長整數
    • s 短整數
    • b 字節
    • c 字符
    • f 單精度浮點數
    • d 雙精度浮點數
    • z 布爾值
    • a 引用
  • 例子
## iadd  表示兩個整數相加
## dadd  表示兩個double類型數據相加
....
  • 參見jvm的規範
## jvm指令碼錶
https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-6.html#jvms-6.5

## jvm字節碼文件格式
https://docs.oracle.com/javase/specs/jvms/se13/html/jvms-4.html#jvms-4.1
發佈了72 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章