JVM——類文件結構

文章目錄

    • 一 概述
    • 二 Class 文件結構總結
      • 2.1 魔數
      • 2.2 Class 文件版本
      • 2.3 常量池
      • 2.4 訪問標志
      • 2.5 當前類索引,父類索引與接口索引集合
      • 2.6 字段表集合
      • 2.7 方法表集合
      • 2.8 屬性表集合

一 概述

在 Java 中,JVM 可以理解的代碼就叫做字節碼(即擴展名為 .class 的文件),它不面向任何特定的處理器,只面向虛擬機。Java 語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程序運行時比較高效,而且,由于字節碼并不針對一種特定的機器,因此,Java 程序無須重新編譯便可在多種不同操作系統的計算機上運行。

Clojure(Lisp 語言的一種方言)、Groovy、Scala 等語言都是運行在 Java 虛擬機之上。下圖展示了不同的語言被不同的編譯器編譯成.class文件最終運行在 Java 虛擬機之上。.class文件的二進制格式可以使用 WinHex 查看。

在這里插入圖片描述

可以說.class文件是不同的語言在 Java 虛擬機之間的重要橋梁,同時也是支持 Java 跨平臺很重要的一個原因。

二 Class 文件結構總結

根據 Java 虛擬機規范,類文件由單個 ClassFile 結構組成:

ClassFile {u4             magic; //Class 文件的標志u2             minor_version;//Class 的小版本號u2             major_version;//Class 的大版本號u2             constant_pool_count;//常量池的數量cp_info        constant_pool[constant_pool_count-1];//常量池u2             access_flags;//Class 的訪問標記u2             this_class;//當前類u2             super_class;//父類u2             interfaces_count;//接口u2             interfaces[interfaces_count];//一個類可以實現多個接口u2             fields_count;//Class 文件的字段屬性field_info     fields[fields_count];//一個類會可以有多個字段u2             methods_count;//Class 文件的方法數量method_info    methods[methods_count];//一個類可以有個多個方法u2             attributes_count;//此類的屬性表中的屬性數attribute_info attributes[attributes_count];//屬性表集合
}

下面詳細介紹一下 Class 文件結構涉及到的一些組件。

Class文件字節碼結構組織示意圖 (之前在網上保存的,非常不錯,原出處不明):

在這里插入圖片描述

2.1 魔數

    u4             magic; //Class 文件的標志

每個 Class 文件的頭四個字節稱為魔數(Magic Number),它的唯一作用是確定這個文件是否為一個能被虛擬機接收的 Class 文件

程序設計者很多時候都喜歡用一些特殊的數字表示固定的文件類型或者其它特殊的含義。

2.2 Class 文件版本

    u2             minor_version;//Class 的小版本號u2             major_version;//Class 的大版本號

緊接著魔數的四個字節存儲的是 Class 文件的版本號:第五和第六是次版本號,第七和第八是主版本號

高版本的 Java 虛擬機可以執行低版本編譯器生成的 Class 文件,但是低版本的 Java 虛擬機不能執行高版本編譯器生成的 Class 文件。所以,我們在實際開發的時候要確保開發的的 JDK 版本和生產環境的 JDK 版本保持一致。

2.3 常量池

    u2             constant_pool_count;//常量池的數量cp_info        constant_pool[constant_pool_count-1];//常量池

緊接著主次版本號之后的是常量池,常量池的數量是 constant_pool_count-1(常量池計數器是從1開始計數的,將第0項常量空出來是有特殊考慮的,索引值為0代表“不引用任何一個常量池項”)。

常量池主要存放兩大常量:字面量和符號引用。字面量比較接近于 Java 語言層面的的常量概念,如文本字符串、聲明為 final 的常量值等。而符號引用則屬于編譯原理方面的概念。包括下面三類常量:

  • 類和接口的全限定名
  • 字段的名稱和描述符
  • 方法的名稱和描述符

常量池中每一項常量都是一個表,這14種表有一個共同的特點:開始的第一位是一個 u1 類型的標志位 -tag 來標識常量的類型,代表當前這個常量屬于哪種常量類型.

類型標志(tag)描述
CONSTANT_utf8_info1UTF-8編碼的字符串
CONSTANT_Integer_info3整形字面量
CONSTANT_Float_info4浮點型字面量
CONSTANT_Long_info長整型字面量
CONSTANT_Double_info雙精度浮點型字面量
CONSTANT_Class_info類或接口的符號引用
CONSTANT_String_info字符串類型字面量
CONSTANT_Fieldref_info字段的符號引用
CONSTANT_Methodref_info10類中方法的符號引用
CONSTANT_InterfaceMethodref_info11接口中方法的符號引用
CONSTANT_NameAndType_info12字段或方法的符號引用
CONSTANT_MothodType_info16標志方法類型
CONSTANT_MethodHandle_info15表示方法句柄
CONSTANT_InvokeDynamic_info18表示一個動態方法調用點

.class 文件可以通過javap -v class類名 指令來看一下其常量池中的信息(javap -v class類名-> temp.txt :將結果輸出到 temp.txt 文件)。

2.4 訪問標志

在常量池結束之后,緊接著的兩個字節代表訪問標志,這個標志用于識別一些類或者接口層次的訪問信息,包括:這個 Class 是類還是接口,是否為 public 或者 abstract 類型,如果是類的話是否聲明為 final 等等。

類訪問和屬性修飾符:

在這里插入圖片描述

我們定義了一個 Employee 類

package top.snailclimb.bean;
public class Employee {...
}

通過javap -v class類名 指令來看一下類的訪問標志。

在這里插入圖片描述

2.5 當前類索引,父類索引與接口索引集合

    u2             this_class;//當前類u2             super_class;//父類u2             interfaces_count;//接口u2             interfaces[interfaces_count];//一個類可以實現多個接口

類索引用于確定這個類的全限定名,父類索引用于確定這個類的父類的全限定名,由于 Java 語言的單繼承,所以父類索引只有一個,除了 java.lang.Object 之外,所有的 java 類都有父類,因此除了 java.lang.Object 外,所有 Java 類的父類索引都不為 0。

接口索引集合用來描述這個類實現了那些接口,這些被實現的接口將按 implements (如果這個類本身是接口的話則是extends) 后的接口順序從左到右排列在接口索引集合中。

2.6 字段表集合

    u2             fields_count;//Class 文件的字段的個數field_info     fields[fields_count];//一個類會可以有個字段

字段表(field info)用于描述接口或類中聲明的變量。字段包括類級變量以及實例變量,但不包括在方法內部聲明的局部變量。

field info(字段表) 的結構:

在這里插入圖片描述

  • access_flags: 字段的作用域(public ,private,protected修飾符),是實例變量還是類變量(static修飾符),可否被序列化(transient 修飾符),可變性(final),可見性(volatile 修飾符,是否強制從主內存讀寫)。
  • name_index: 對常量池的引用,表示的字段的名稱;
  • descriptor_index: 對常量池的引用,表示字段和方法的描述符;
  • attributes_count: 一個字段還會擁有一些額外的屬性,attributes_count 存放屬性的個數;
  • attributes[attributes_count]: 存放具體屬性具體內容。

上述這些信息中,各個修飾符都是布爾值,要么有某個修飾符,要么沒有,很適合使用標志位來表示。而字段叫什么名字、字段被定義為什么數據類型這些都是無法固定的,只能引用常量池中常量來描述。

字段的 access_flag 的取值:

字段的 access_flag 的取值

2.7 方法表集合

    u2             methods_count;//Class 文件的方法的數量method_info    methods[methods_count];//一個類可以有個多個方法

methods_count 表示方法的數量,而 method_info 表示方法表。

Class 文件存儲格式中對方法的描述與對字段的描述幾乎采用了完全一致的方式。方法表的結構如同字段表一樣,依次包括了訪問標志、名稱索引、描述符索引、屬性表集合幾項。

method_info(方法表的) 結構:

在這里插入圖片描述

方法表的 access_flag 取值:

在這里插入圖片描述

注意:因為volatile修飾符和transient修飾符不可以修飾方法,所以方法表的訪問標志中沒有這兩個對應的標志,但是增加了synchronizednativeabstract等關鍵字修飾方法,所以也就多了這些關鍵字對應的標志。

2.8 屬性表集合

   u2             attributes_count;//此類的屬性表中的屬性數attribute_info attributes[attributes_count];//屬性表集合

在 Class 文件,字段表,方法表中都可以攜帶自己的屬性表集合,以用于描述某些場景專有的信息。與 Class 文件中其它的數據項目要求的順序、長度和內容不同,屬性表集合的限制稍微寬松一些,不再要求各個屬性表具有嚴格的順序,并且只要不與已有的屬性名重復,任何人實現的編譯器都可以向屬性表中寫 入自己定義的屬性信息,Java 虛擬機運行時會忽略掉它不認識的屬性。

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

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

相關文章

winform 封裝unity web player 用戶控件

環境: VS2015Unity 5.3.6f1 (64-bit) 目的: Unity官方提供的UnityWebPlayer控件在嵌入Winform時要求讀取的.unity3d文件路徑(Src)必須是絕對路徑,如果移動代碼到另一臺電腦,需要重新修改src。于是考慮使…

elementUI 的上傳組件<el-upload>,自定義上傳按鈕樣式

方法一&#xff1a; 原理&#xff1a;調用<el-upload>組件的方法喚起選擇文件事件 效果&#xff1a; 頁面代碼&#xff1a; 1、選擇圖片按鈕 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

matlab機器人工具箱基礎使用

資料&#xff1a;https://blog.csdn.net/huangjunsheng123/article/details/110630665 用vscode直接看工具箱api代碼比較方便&#xff0c;代碼說明很多 一、模型設置 1、基礎效果 %采用機器人工具箱進行正逆運動學驗證 a[0,-0.3,-0.3,0,0,0];%DH參數 d[0.05,0,0,0.06,0.05,…

教育行業軟文怎么寫,媒介盒子無償分享

隨著產業升級和技術變革、信息的智能化、數字化發展&#xff0c;也為教育行業帶來了新的增長點&#xff0c;在線教育課程類型豐富多元&#xff0c;新課程不斷涌現。在激烈的市場競爭環境下&#xff0c;教育機構如何根據市場實行差異化戰略并加強自身品牌建成為挑戰。 如今&…

微服務-Ribbon(負載均衡)

負載均衡的面對多個相同的服務的時候&#xff0c;我們選擇一定的策略去選擇一個服務進行 負載均衡流程 Ribbon結構組成 負載均衡策略 RoundRobinRule&#xff1a;簡單的輪詢服務列表來選擇服務器AvailabilityFilteringRule 對兩種情況服務器進行忽略&#xff1a; 1.在默認情…

Php“牽手”拼多多商品詳情頁數據采集方法,拼多多API接口申請指南

拼多多詳情接口 API 是開放平臺提供的一種 API 接口&#xff0c;它可以幫助開發者獲取商品的詳細信息&#xff0c;包括商品的標題、描述、圖片等信息。在電商平臺的開發中&#xff0c;詳情接口API是非常常用的 API&#xff0c;因此本文將詳細介紹詳情接口 API 的使用。 一、拼…

315官方點贊!多燕瘦或將成酵素選購唯一標準

食用酵素及其衍生產品&#xff0c;是近年來國內主流電商平臺的主要增長類目之一。在全球范圍內&#xff0c;酵素的流行由來已久&#xff0c;其中在日本、北美、歐洲等發達國家和地區尤為風靡。據不完全統計&#xff1a;歐洲酵素市場規模約占全球酵素市場份額的40%以上&#xff…

【Linux】一切皆文件

Linux 下一切皆為文件&#xff0c; 文件包括頭文件&#xff0c;庫文件&#xff08;靜態庫和共享庫&#xff09;&#xff0c;可執行文件&#xff0c;目錄文件&#xff0c;軟鏈接文件&#xff0c;配置文件等。 每個文件都依據權限分為用戶、用戶組和其他人三個身份&#xff0c;…

webpack相關面試

運行 npm run xxx 的時候發生了什么&#xff1f; npm run xxx的時候&#xff0c;首先會去項目的package.json文件里找scripts 里找對應的xxx&#xff0c;然后執行 xxx的命令 npm i 的時候&#xff0c;npm 讀到該配置后&#xff0c;就將該文件軟鏈接到 ./node_modules/.bin 目錄…

vscode conda activate激活環境出錯

vscode conda activate 出錯 conda-script.py: error: argument COMMAND: invalid choice: ‘activate’ To initialize your shell, run$ conda init <SHELL_NAME>Currently supported shells are:- bash- fish- tcsh- xonsh- zsh- powershellSee conda init --help f…

自定義Android滑塊拼圖驗證控件

自定義Android滑塊拼圖驗證控件 拼圖認證視圖默認策略工具類參考 1、繼承自AppCompatImageView&#xff0c;兼容ImageView的scaleType設置&#xff0c;可設置離線/在線圖片。 2、通過設置滑塊模型&#xff08;透明背景的圖形塊&#xff09;設置滑塊&#xff08;和缺省塊&#x…

【HarmonyOS北向開發】-01 HarmonyOS概述

飛書原文鏈接-【HarmonyOS北向開發】-01 HarmonyOS概述https://fvcs2dhq8qs.feishu.cn/docx/TDf2d2KMaoPSUUxnvg2cASDdnCe?fromfrom_copylink

Leetcode-每日一題【劍指 Offer 20. 表示數值的字符串】

題目 請實現一個函數用來判斷字符串是否表示數值&#xff08;包括整數和小數&#xff09;。 數值&#xff08;按順序&#xff09;可以分成以下幾個部分&#xff1a; 若干空格一個 小數 或者 整數&#xff08;可選&#xff09;一個 e 或 E &#xff0c;后面跟著一個 整數若干空…

xcode把包打到高版本的iPhone里

打開xcode CTRLb build工程&#xff0c;build成功 把手機連到mac&#xff0c;在xcode選項卡里面的window里面選中device and simulator 打開對應的手機的頁面 然后在工程目錄下build成功過后有一個product的文件夾里面&#xff0c;直接把app拖到對應的手機的窗口就可以不用…

指針和數組簡單填空題合集(純刷題:60道)

前言 本篇文章適合初學指針和數組的朋友&#xff0c;如果您看了前幾組題覺得很簡單&#xff0c;可以看一看我的另一篇文章。 通過本篇文章&#xff0c;你可以清晰的區分出strlen和sizeof的區別&#xff0c;&#xff08;題目類型包括一維數組、二維數組&#xff09;并提高自己…

Linux NTP原理及配置使用

一、NTP簡介 1.NTP簡介 NTP&#xff08;Network Time Protocol&#xff0c;網絡時間協議&#xff09;是用來使網絡中的各個計算機時間同步的一種協議。它的用途是把計算機的時鐘同步到世界協調時UTC&#xff0c;其精度在局域網內可達0.1ms&#xff0c;在互聯網上絕大多數的…

CSS自學框架之動畫

這一節&#xff0c;自學CSS動畫。主要學習了淡入淡出、淡入縮放、縮放、移動、旋轉動畫效果。先看一下成果。 優雅的過渡動畫&#xff0c;為你的頁面添加另一份趣味&#xff01; 在你的選擇器里插入 animation 屬性&#xff0c;并添加框架內置的 keyframes 即可實現&#xff0…

《Kubernetes部署篇:Ubuntu20.04基于外部etcd+部署kubernetes1.24.16集群(多主多從)》

一、架構圖 如下圖所示: 二、環境信息 1、部署規劃 主機名K8S版本系統版本內核版本IP地址備注k8s-master-631.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.63master節點 + etcd節點k8s-master-641.24.16Ubuntu 20.04.5 LTS5.15.0-69-generic192.168.1.64master節點 + …

【抖音直播小玩法】介紹

一、是什么 直播小玩法是基于抖音直播場景的新型實時互動內容。直播小玩法由開發者自主開發&#xff0c;接入平臺并開放給抖音主播掛載使用。開發者提供創意&#xff0c;依托平臺生態&#xff0c;獲取收益。 介入標準&#xff1a; 企業開發者&#xff0c;暫不支持個人開發者…

DAMO-YOLO:實時目標檢測設計的報告

ReadPaperhttps://readpaper.com/pdf-annotate/note?pdfId4748421678288076801eId1920373270663763712 Abstract 在本報告中&#xff0c;我們提出了一種快速準確的目標檢測方法&#xff0c;稱為DAMO-YOLO&#xff0c;它比最先進的YOLO系列實現了更高的性能。DAMO-YOLO 通過…