5 位元組碼文件結構

来源:https://www.cnblogs.com/knowledgeispower/archive/2022/10/25/16826239.html
-Advertisement-
Play Games

1 Class類文件結構 Class文件:是一組以8個位元組為基礎單位的二進位流,當需要存儲空間超過8位元組時,會按照高位在前的方式分割【大端法】成若幹個8個位元組進行存儲 魔數:頭4個位元組,固定值為:0xCAFEBABE 版本號:魔數的後繼4個位元組,第5和第6個位元組是次版本號,第7和第8個位元組是主版本號 ...


目錄

1 Class類文件結構

  1. Class文件:是一組以8個位元組為基礎單位的二進位流,當需要存儲空間超過8位元組時,會按照高位在前的方式分割【大端法】成若幹個8個位元組進行存儲
  2. 魔數:頭4個位元組,固定值為:0xCAFEBABE
  3. 版本號:魔數的後繼4個位元組,第5和第6個位元組是次版本號,第7和第8個位元組是主版本號
  4. 常量池:版本號的後續位元組。
  5. 常量池的常量計數值:常量池部分的前2個位元組,表示該文件有多少個常量,計數值從1開始
  6. 常量池的常量:分為字面量、符號引用
  7. 字面量:接近於Java語言層面的常量概念,如文本字元串、被聲明為final的常量值等
  8. 符號引用:編譯原理方面的概念。

2 常量池

常量池的常量分為兩種類型:字面量、符號引用

2.1 字面量

字面量比 較接近於Java語言層面的常量概念,如文本字元串、被聲明為final的常量值等。

2.2 符號引用

符號引用則屬於編譯原理方面的概念,包括這幾類:

  • 包(Package)
  • 類和介面的全名
  • 欄位的名稱和描述符
  • 方法的名稱和描述符
  • 方法句柄和方法類型
  • 動態調用點和動態常量

2.3 常量的表結構

常量池中每一項常量都是一個表,一共有17種表結構,因此一共有17種常量。17種常量類型如下所示:

2.3.1 表結構的屬性解析

表結構,可以表示為:【屬性:對應的值】,每種常量類型(表)都有一個或者多個屬性,所有屬性的解釋如下:

  • tag:標誌位,用於區分常量類型。
  • index:常量池的索引值,它指向常量池中另外一種類型常量。
  • length:該UTF-8編碼的字元串長度是多少位元組 (只有CONSTANT_Utf8_info類型才有該屬性)
  • bytes:表示 UTF-8_info、Float_info、integer_info 、Long_info、Double_info 等常量類型的值。
  • reference_kind:
  • reference:index:
  • descriptor_index:
  • .......

2.3.2 17種常量的表結構解析

表結構起始的第一位都是flag標誌位

(JDK7增加的三種:CONSTANT_MethodHandle_info、CONSTANT_MethodType_info和 CONSTANT_InvokeDynamic_info,JDK11中又增加了第四種常量CONSTANT_Dynamic_info,在後續章節中詳細解)

2.4 javap分析位元組碼文件

javap:用於分析Class文件位元組碼的工具,在JDK的bin目錄中。
javap -verbose 輸出位元組碼的內容。

測試的java代碼

package com.minnesota.practice.test;

public class ByteCodeTest {
    private static final String DREAM = "byte dancing";
    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int c = a+b;
    }
}

ByteCodeTest.class 內容瀏覽:

javap -verbose ByteCodeTest.class 解析後

javap -verbose ByteCodeTest.class

輸出結果:
Classfile /路徑脫敏/ByteCodeTest.class
  Last modified 2022-10-25; size 396 bytes
  MD5 checksum be72a2ed3bf8578da63968ce35880d3d
  Compiled from "ByteCodeTest.java"
public class com.minnesota.practice.test.ByteCodeTest
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
   #1 = Methodref          #3.#16         // java/lang/Object."<init>":()V
   #2 = Class              #17            // com/minnesota/practice/test/ByteCodeTest
   #3 = Class              #18            // java/lang/Object
   #4 = Utf8               DREAM
   #5 = Utf8               Ljava/lang/String;
   #6 = Utf8               ConstantValue
   #7 = String             #19            // byte dancing
   #8 = Utf8               <init>
   #9 = Utf8               ()V
  #10 = Utf8               Code
  #11 = Utf8               LineNumberTable
  #12 = Utf8               main
  #13 = Utf8               ([Ljava/lang/String;)V
  #14 = Utf8               SourceFile
  #15 = Utf8               ByteCodeTest.java
  #16 = NameAndType        #8:#9          // "<init>":()V
  #17 = Utf8               com/minnesota/practice/test/ByteCodeTest
  #18 = Utf8               java/lang/Object
  #19 = Utf8               byte dancing
{
  public com.minnesota.practice.test.ByteCodeTest();
    descriptor: ()V
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 3: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=4, args_size=1
         0: iconst_1
         1: istore_1
         2: iconst_2
         3: istore_2
         4: iload_1
         5: iload_2
         6: iadd
         7: istore_3
         8: return
      LineNumberTable:
        line 6: 0
        line 7: 2
        line 8: 4
        line 9: 8
}
SourceFile: "ByteCodeTest.java"

todo 這塊還沒看懂

待續!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## WebSocket的簡單使用 ws_ht() { let url = window._CONFIG['wsURL'] //console.log('後臺WS開始連接') // 實例化socket this.socket_ht = new WebSocket(url) // 監聽socket連 ...
  • 相信大家在前端開發中都使用過很多前端腳手架,如vue-cli,create-vite,create-vue等;本篇文章將會為大家詳細介紹這些前端腳手架是如何實現的,並且從零實現一個create-kitty腳手架發佈到npm上。 pnpm搭建Monorepo環境 使用pnpm管理對項目進行管理是非常方 ...
  • 01、基礎元素 <h1/2/3/4/5/6>標題 從大h1到小h6,塊元素,有6級標題。是一種標題類語義標簽,內置了字體、邊距樣式。 合理使用h標簽,主要用於標題,不要為了加粗效果而隨意使用。 h1用於最重要的標題內容,會被搜索引擎使用,用得太多影響SEO效果。 <h1 align="center" ...
  • 顧名思義,狀態模式用於解決系統中與狀態相關的問題,如複雜對象的狀態轉換以及不同狀態下行為的封裝問題。 ...
  • 您好,我是湘王,這是我的博客園,歡迎您來,歡迎您再來~ 除了可以通過ThreadPoolExecutor自定義線程池外,同Stream API中的Collectors一樣,多線程里的Executors類也提供了一組相關的線程池工具,可以直接拿來用,不用考慮用什麼隊列合適的問題。 Javac除了傳統的 ...
  • 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> OpenGL ES 特效 零基礎 OpenGL ES 學習路線推薦 : OpenGL ES 學習目錄 >> O ...
  • 馬踏棋盤 1.演算法優化的意義 演算法是程式的靈魂,為什麼有些程式可以在海量數據計算時,依舊保持高速計算? 編程中演算法很多,比如八大排序演算法(冒泡、選擇、插入、快排、歸併、希爾、基數、堆排序)、查找演算法、分治演算法、動態規划算法、KMP演算法、貪心演算法、普利姆演算法、克魯斯卡爾演算法、迪傑斯特拉演算法、弗洛伊德算 ...
  • 一. 字面量 代碼中,被寫在代碼中的固定的值,稱之為字面量 Python常用6種值(數據)類型 字元串(string) :又稱文本,是由任意數量的字元如中文、英文、各類符號、數字等組成。所以叫做字元的串。 測試 (666 13.14 "木風" 都是字面量) 二. 註釋 對代碼進行解釋說明(不能被執行 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...