JVM字節碼文件結構

Class文件結構

class文件是二進制文件,這里要介紹的是這個二級制文件的結構。

思考:一個java文件編譯成class文件,如果要描述一個java文件,需要哪些信息呢?

  • 基本信息:類名、父類、實現哪些接口、方法個數、每個方法名稱和參數和訪問屬性、每個方法的內容、屬性個數、屬性名稱和類型和訪問屬性、構造方法。
  • 編譯信息:編譯的JDK版本

Class文件結構參照表

  • 常量池表長度 = constant_pool_count(常量個數) - 1, 原因是 常量池第0個位置被JVM占用了表示為null

Class文件示例分析

.java文件

public class TulingByteCode {private String userName;public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}
}

先將其編譯成class文件:javac TulingByteCode.java

再將.class文件反編譯:javap -v TulingByteCode.class

.class文件反編譯

Classfile /Users/xxxx/Documents/xxx/xxxx/app/test/src/test/java/com/xxxx/xxxxx/TulingByteCode.classLast modified 2025-8-14; size 450 bytesMD5 checksum 9e4f059c2aa6ec60f9c7f0093b58a2f6Compiled from "TulingByteCode.java"
public class com.xxxxx.xxxxxxx.TulingByteCodeminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #4.#17         // java/lang/Object."<init>":()V#2 = Fieldref           #3.#18         // com/xxxx/xxxxx/TulingByteCode.userName:Ljava/lang/String;#3 = Class              #19            // com/xxxxx/xxxxxxx/TulingByteCode#4 = Class              #20            // java/lang/Object#5 = Utf8               userName#6 = Utf8               Ljava/lang/String;#7 = Utf8               <init>#8 = Utf8               ()V#9 = Utf8               Code#10 = Utf8               LineNumberTable#11 = Utf8               getUserName#12 = Utf8               ()Ljava/lang/String;#13 = Utf8               setUserName#14 = Utf8               (Ljava/lang/String;)V#15 = Utf8               SourceFile#16 = Utf8               TulingByteCode.java#17 = NameAndType        #7:#8          // "<init>":()V#18 = NameAndType        #5:#6          // userName:Ljava/lang/String;#19 = Utf8               com/xxxx/xxxxxx/TulingByteCode#20 = Utf8               java/lang/Object
{public com.xxxxx.xxxxxx.TulingByteCode();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 7: 0public java.lang.String getUserName();descriptor: ()Ljava/lang/String;flags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: getfield      #2                  // Field userName:Ljava/lang/String;4: areturnLineNumberTable:line 11: 0public void setUserName(java.lang.String);descriptor: (Ljava/lang/String;)Vflags: ACC_PUBLICCode:stack=2, locals=2, args_size=20: aload_01: aload_12: putfield      #2                  // Field userName:Ljava/lang/String;5: returnLineNumberTable:line 15: 0line 16: 5
}
SourceFile: "TulingByteCode.java"

.class文件二進制

部分截圖如下:

.class文件分析

1. 常量池入口

第一行 00 09

常量池入口(常量個數),占用二個字節,表示常量池中的個數=00 19 (25)-1=24個, 為啥需要-1,因為常量池中的第0個位置被JVM占用了表示為null ,所以編譯出來的常量池索引是從1開始的.

對應的.class反編譯結果中,常量池有24個,索引從1開始。

2. 常量池類

JVM數據類型

????????JVM表示數據類型時,表示數據類型時有自己的規范。

????????基本參數類型和void類型都是用一個大寫的字符來表示,對象類型是通過一個大寫L加全類名表示,這么做的好處就是在保證jvm能讀懂class文件的情況下盡量的壓縮class文件體積.

基本數據類型表示:

  • B---->byte
  • C---->char
  • D---->double
  • F----->float
  • I------>int
  • J------>long
  • S------>short
  • Z------>boolean
  • V------->void

對象類型:

  • String------>Ljava/lang/String;(后面有一個分號)

對于數組類型: 每一個唯獨都是用一個前置 [ 來表示比如:

  • int[] ------>[ I,
  • String [][]------>[[Ljava.lang.String;

用描述符來描述方法,先參數列表,后返回值的格式,參數列表按照嚴格的順序放在()中。

比如源碼 String getUserInfoByIdAndName(int id,String name) 的方法描述符號(I,Ljava/lang/String;)Ljava/lang/String;

?常量池類型分類

u1,u2,u4,u8分別代表1個字節,2個字節,4個字節,8個字節的無符號數。

規范性的數據,暫時不全列出來了, 舉個栗子吧

常量項目類型描述
CONSTANT_Utf8_infotagu1值為1
lengthu2UTF-8編碼的字符串占用的字節數
bytesu1長度為length的UTF-8編碼的字符串
CONSTANT_Methodref_infotagu1值為10
class_indexu2指向聲明方法的類描述符CONSTANT_Class_info的索引項
name_and_type_indexu2指向名稱和類型描述符CONSTANT_NameAndType 的索引項

分析常量池的第一個常量:

  • class_index 00 04? ?: 二個字節表示的是是方法所在類 指向常量池的索引位置為#4,然后我們發現#4的常量類型是Class,也是符號引用類型,指向常量池#24的位置,而#24是的常量池類型是字面量值為:java/lang/Object
  • name_and_type_index 00 15:二個字節表示是方法的描述符,指向常量池索引#21的位置,我們發現#21的常量類型是"NameAndType類型"屬于引用類型,指向常量池的#7 #8位置,#7常量類型是UTF-8類型屬于字面量值為:<init>? 構造方法, #8常量也是UTF-8類型的字面量值為:()V
  • 所以常量池中的第一個常量是:java/lang/Object."<init>":()V

常量池可以看作java class類的一個資源倉庫(比如Java類定的方法和變量信息),我們后面的方法 類的信息的描述信息都是通過索引去常量池中獲取。

常量池中主要存放兩種常量,一種是字面量 ,一種是符號引用。

編譯的時候確認局部變量表的長度

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95760.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

11.web api 2

5. 操作元素屬性 5.1操作元素常用屬性 &#xff1a;通過 JS 設置/修改標簽元素屬性&#xff0c;比如通過 src更換 圖片最常見的屬性比如&#xff1a; href、title、src 等5.2 操作元素樣式屬性 &#xff1a;通過 JS 設置/修改標簽元素的樣式屬性。使用 className 有什么好處&a…

java中數組和list的區別是什么?

在Java中&#xff0c;數組&#xff08;Array&#xff09;和List&#xff08;通常指java.util.List接口的實現類&#xff0c;如ArrayList、LinkedList&#xff09;是兩種常用的容器&#xff0c;但它們在設計、功能和使用場景上有顯著區別。以下從核心特性、使用方式等方面詳細對…

Python爬取推特(X)的各種數據

&#x1f31f; Hello&#xff0c;我是蔣星熠Jaxonic&#xff01; &#x1f308; 在浩瀚無垠的技術宇宙中&#xff0c;我是一名執著的星際旅人&#xff0c;用代碼繪制探索的軌跡。 &#x1f680; 每一個算法都是我點燃的推進器&#xff0c;每一行代碼都是我航行的星圖。 &#x…

Oracle數據庫文件管理與空間問題解決指南

在Oracle數據庫運維中&#xff0c;表空間、數據文件及相關日志文件的管理是保障數據庫穩定運行的核心環節。本文將系統梳理表空間與數據文件的調整、關鍵文件的移動、自動擴展配置&#xff0c;以及常見空間不足錯誤的排查解決方法&#xff0c;為數據庫管理員提供全面參考。 一、…

華為實驗綜合小練習

描述&#xff1a; 1 內網有A、B、C 三個部門。所在網段如圖所示。 2 內網服務器配置靜態IP,網關192.168.100.1。 3 sw1和R1之間使用vlan200 192.168.200.0/30 互聯。 4 R1向運營商申請企業寬帶并申請了5個公網IP&#xff1a;200.1.1.1-.5子網掩碼 255.255.255.248&#xff0c;網…

Flink面試題及詳細答案100道(1-20)- 基礎概念與架構

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

爬蟲逆向之滑塊驗證碼加密分析(軌跡和坐標)

本文章中所有內容僅供學習交流使用&#xff0c;不用于其他任何目的。否則由此產生的一切后果均與作者無關&#xff01;在爬蟲開發過程中&#xff0c;滑塊驗證碼常常成為我們獲取數據的一大阻礙。而滑塊驗證碼的加密方式多種多樣&#xff0c;其中軌跡加密和坐標加密是比較常見的…

微信小程序實現導航至目的地

本人做的導航頁面相關功能和效果的代碼 javascript相關 Page({data: {markers: [],latitude: , // 中心點坐標longitude: ,FIXED_LAT: 31.2304, // 1. 寫死的目標點坐標, 示例&#xff1a;上海人民廣場FIXED_LNG: 121.4737},onLoad: function () {// 如果要顯示地圖可以看onLo…

中國科學社簡史

中國科學社簡史中國科學社&#xff0c;作為中國近代史上第一個民間綜合性科學團體&#xff0c;為中國現代科學文化事業的發展做出了卓越貢獻。其歷程不僅見證了中國科學從萌芽到蓬勃發展的轉變&#xff0c;還反映了中國科學體制化的艱難探索與輝煌成就。中國科學社的起源可追溯…

若爾當型,Jordon Form

文章目錄一、相似二、若爾當型1.1 認識若爾當型1.2 凱萊-哈密頓定理 (Cayley-Hamilton Theorem)一、相似 Every matrix CB?1ABC B^{-1}ABCB?1AB has the same eigenvalues as A. These C’s are similar to A. 任意一個矩陣C&#xff0c;滿足 CB?1ABC B^{-1}ABCB?1AB 都和…

解決uni-app微信小程序編譯報錯:unexpected character `1`

問題原因在uni-app微信小程序開發中&#xff0c;當template模板中包含英文符號<或>時&#xff0c;微信小程序的編譯器會將這些符號誤認為是HTML標簽的開閉符號&#xff0c;從而導致類似unexpected character 1的編譯錯誤。錯誤示例<view class"plan-bmi">…

[Linux] RAID存儲技術

目錄 RAID實現方式 RAID 0 RAID 1 RAID 5 RAID 10 管理RAID0 創建RAID 查看RAID 格式化和掛載 刪除RAID 管理RAID1 創建RAID 查看RAID 格式化和掛載 增加熱備盤 模擬故障 刪除故障磁盤 刪除RAID 管理RAID5 創建RAID 查看RAID md5設備劃分分區 RAID實現方…

程序設計|C語言教學——C語言基礎4:進階

一、預處理指令預處理指令在編譯前執行&#xff0c;除了#include&#xff0c;還有以下常用指令&#xff1a;1. #define 宏定義無參宏&#xff1a;定義常量或代碼片段&#xff0c;編譯時直接替換&#xff08;無類型檢查&#xff09;。#define PI 3.1415926 // 定義常量 #define…

數據結構之heap算法

文章目錄前言1. heap結構概述2. push_heap3. pop_heap4. sort_heap5. make_heap前言 heap這種數據結構&#xff0c;允許用戶以任何次序將任何數據放入該結構中&#xff0c;但是最后取出數據的時候一定是權值最高&#xff08;或者最低&#xff09;的元素。主要和實現有關&#x…

MCU 軟件斷點調試注意事項!!!

——為什么調試器會在運行中改我的Flash程序&#xff1f;調試單片機時&#xff0c;很多人都有這樣的疑問&#xff1a;明明我在調試前刷進去的固件是好的&#xff0c;為什么加了一個斷點之后&#xff0c;調試器居然去改了 Flash&#xff1f; 如果我拔掉調試器&#xff0c;這個固…

啟發式合并 + 莫隊 戀戀的心跳大冒險

題目來源&#xff1a;2025 Wuhan University of Technology Programming Contest 比賽鏈接&#xff1a;Dashboard - 2025 Wuhan University of Technology Programming Contest - Codeforces 題目大意&#xff1a; Solution&#xff1a; 首先肯定要預處理出以每個節點為起點…

JCTools 無鎖并發隊列基礎:ConcurrentCircularArrayQueue

ConcurrentCircularArrayQueue ConcurrentCircularArrayQueue 是一個抽象類&#xff0c;它為基于數組的并發循環隊列提供了基礎功能。從其命名可以看出幾個關鍵特性&#xff1a;??Concurrent??&#xff1a;常指無鎖并發。??Circular Array??&#xff1a;內部使用循環數…

力扣(LeetCode) ——622. 設計循環隊列(C語言)

題目&#xff1a;622. 設計循環隊列示例1&#xff1a; MyCircularQueue circularQueue new MyCircularQueue(3); // 設置長度為 3 circularQueue.enQueue(1); // 返回 true circularQueue.enQueue(2); // 返回 true circularQueue.enQueue(3); // 返回 true circularQueue.…

在JVM跑JavaScript腳本 | Oracle GraalJS 簡介與實踐

這是2024年初的 GraalVM 系列博文&#xff0c;當時寫了大綱&#xff0c;知道一年半后的現在才得以完成發布&#x1f604; 1、概述 實話說&#xff0c;標題的場景為小眾需求&#xff0c;日常開發基本用不到&#xff0c;我是最近在做一個低代碼輪子玩具 app-meta 需要實現 FaaS&…

基于 EC 數據與大模型技術實現天氣預報:從數據到上線的全棧方法

1. 先校準“EC 數據”與“AI 預報”的語境 EC 數據家族(常用) IFS/HRES:確定性全球模式,水平分辨率約 9 km,常用預報范圍 10 天; IFS/ENS:51 成員集合預報,提供 15 天概率信息; ERA5:再分析數據,小時級、0.25,可追溯至 1940 年,用作訓練/評測黃金基準。 AI 預報…