JVM學習-Class文件結構②

訪問標識(access_flag)
  • 在常量池后,緊跟著訪問標記,標記使用兩個字節表示,用于識別一些類或接口層次的訪問信息,包括這個Class是類還是接口,是否定義為public類型,是否定義為abstract類型,如果是類的話,是否聲明為final等,各種訪問標記如下:
    在這里插入圖片描述
  • 類的訪問權限通常為ACC_開頭的常量
  • 每一種類型的表示都是通過設置訪問標記的32位中的特定位來實現的,比如,若是public final的類,則該標記為ACC_PUBLIC | ACC_FINAL
  • 使用ACC_SUPER可以讓類更準確地定位到父類的方法super.method(),現代編譯器都會設置并且使用這個標記
  • 帶有ACC_INTERFACE標志的class文件表示是接口不是類,反之則表示是類而不是接口
  • 如果一個class文件被設置了ACC_INTERFACE標志,那么同時也得設置ACC_ABSTRACT標志,同時不能設置ACC_FINAL、ACC_SUPER或ACC_ENUM標志
  • 如果沒有設置ACC_INTERFACE標志,那么這個class文件可以具有上表中除ACC_ANNOTATION外的其他所有標志,當然ACC_FINAL和ACC_ABSTRACT這類互斥的標志除外,這兩個標志不能同時設置
  • ACC_SUPER標志用于標志用于確定類或接口里面的invokespecial指令使用的哪一種執行語義,針對Java虛擬機指令集的編譯器都應設置這個標志,對于Java SE8及后續版本來說,無論class文件中這個標志的實際值是什么,也不管class文件的版本是多少,Java虛擬機會為每個class文件均設置ACC_SUPER標志
  • ACC_SUPER標志為了向后兼容由舊Java編譯器所編譯的代碼而設計,目前的ACC_SUPER標志在由JDK1.0.2之前的編譯器生成的access_flags中沒有確定意義,如果設置該標志,oracle的JVM實現會將其忽略
  • ACC_SYNTHETIC標志意味著該類或接口是由編譯器生成的,而不是由源代碼生成的
  • 注解類型必須設置為ACC_ANNOTATION標志,如果設置了ACC_ANNOTATION標志,那么也必須設置ACC_INTERFACE標志
  • ACC_ENUM標志表明該類或其父類為枚舉類型
  • 表中沒有使用的Access_flags標志為未來擴充預留,這些預留標志在編譯器中應該設置為0,JVM實現也應忽略他們
類索引、父類索引、接口索引集合
  • 在訪問標記后,會指定該類的類別、父類類別及實現的接口,格式如下
    在這里插入圖片描述
  • 這三項數據來確認這個類的繼承關系
  • 類索引用于確定這個類的全限定名
  • 類索引用于確定這個類的父類的全限定名,由于Java語言不允許多重繼承,父類索引只有一個,除java.lang.Object除外,所有的Java類都有父類,除java.lang.Object外,所有Java類的父類索引都不為0
  • 接口索引集合就用來描述這個類實現了哪些接口,這些被實現的接口按implements語句(如果類本身為接口,則應使用extends語句)后的接口順序從左到右排列在接口索引集體中
類索引this_class

2字節無符號整數,指向常量池的索引,它提供了類的全限定名,如com/chapter09/Demo,this_class的值必須是對常量池表中某項的一個有效索引,常量池在這個索引處的成員都必須為CONSTANT_Class_info類型結構體,該結構表示這個class文件所定義的類或接口

父類索引super_class
  • 2字節無符號整數,指向常量池的索引,它提供了父類的全限定名,如無繼承關系,其默認繼承java/lang/Object類,由于Java不支持多繼承,其父類只有一個
  • superclass指向的父類不能是final
interfaces
  • 指向常量也索引集合,它提供了一個符號引用到所有已實現的接口
  • 由于一個類可以實現多個接口,因此需要以數組形式保存多個接口的索引,表示接口的第個索引也是一個指向常量池的CONSTANT_Class(此處必須是接口,不是類)
  • interfaces_count接口計數器
    interfaces_count項的值表示當前類或接口的直接超接口數量
  • interfaces[]接口索引集合
    interfaces[]中每個成員的值必須是對常量池表中某項的有效索引值,它的長度為interfaces_count,每個成員interfaces[i]必須為CONSTANT_Class_info結構,其中0 <= i < interfaces_count,在interfaces[]中,各成員所表示的接口順序和對應的源代碼中給定的接口順序一樣,即interfaces[0]對應的是源代碼中最左邊的接口
字段表集合
  • 用于描述接口或類聲明的變量,字段(field),包括類級變量以及實例級變量,但不包括方法內部、代碼塊內部聲明的局部變量
  • 字段叫什么名字、字段定義的是什么數據類型,這此都是無法固定的,只能引用常量池中的常量來描述
  • 它指向常量池索引集合,它描述了每個字段的完整信息,比如字段的標識符、訪問修飾符(public,private,protected),是類變量還是實例變量(static修飾符),是否是常量(final修飾符)等
    注:
  • 字段表集體中不會列出從父類或者實現接口中繼承而來的字段,但有可能列出原本Java代碼中不存在的字段,譬如在內部類中為了保持對外部類的訪問性,會自動添加指向外部類實例的字段
  • 在Java語言中字段是無法重載的,兩個字段的數據類型、修飾符不管是否相同,都必須使用不一樣的名稱,但是對于字節碼來講,如果兩個字段的描述符不一致,那字段重名就是合法的
字段計數器fields_count
  • fields_count的值表示當前class文件fields表的成員個數,使用兩個字節來表示
  • fields表中線個成員都是一個field_info結構,用于表示該類或接口所聲明的所有類字段或實例字段,不包括方法內部聲明的變量,也不包括從父類或父接口繼承的那些字段
字段表fields[]
  • fields表中的每個成員都必須是一個fields_info結構的數據項,用于表示當前類或接口中某個字段的完整描述
  • 一個字段的信息包括如下這些信息,這些信息中,各個修飾符都是布爾值,要么有,要么沒有
  • 作用域(public,private,protected修飾符)
  • 是實例變量還是類變量(static修飾)
  • 可變性(final)
  • 并發可見性(volatile修飾,是否強制從 內存讀寫)
  • 可否序列化(transient修飾)
  • 字段數據類型(基本數據類型、對象、數組)
  • 字段名稱
  • 字段表結構
    在這里插入圖片描述
字段表訪問標識

一個字段可以被各種關鍵字去修飾,如作用域修飾符(public,private,protected)、static修飾符、final修飾、volatile修飾符等,因此,其可像類的訪問標志那樣,使用一些標志來標記字段,字段的訪問標志有如下:
在這里插入圖片描述

字段名索引
  • 根據字段名索引的值,查詢常量池中的指定索引項即可
描述符索引
  • 描述符的作用用來描述字段的數據類型、方法的參數列表和返回值,根據描述符規則,基本數據類型及代表無返回值的void類型都用一個大寫字符來表示,而對象用L加對象的全限定名來表示,如下:
    在這里插入圖片描述
屬性表集合
  • 一個字段還可能擁有一些屬性,用于存儲更多的額外信息,比如初始化值、一些注釋信息等,屬性個數存放在Attribute_count中,屬性具體內容存放在attributes數組中
//以常量屬性為例
ConstantValue_attribute {u2 attribute_name_index;u4 attribute_length;u2 constantvalue_index;
}
//說明常量屬性而言,attribute_length的值恒為2
方法表集合
屬性表集合

待續… …

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

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

相關文章

健身房會員管理系統服務預約小程序的作用是什么

擁有完美身材/減肥/鍛煉等前往健身房是個不錯的選擇&#xff0c;商家生意開展需要吸引同城客戶并轉化&#xff0c;客戶也有自己的判斷需要找到更全面的場地&#xff1b;完善客戶消費流程利于品牌發展和不斷獲客轉化。 運用【雨科】平臺搭建健身房管理系統小程序&#xff0c;多…

MySQL事務篇1:事物的四大特性(ACID)、三類數據讀取問題與隔離級別

一、什么是事務&#xff1f; MySQL的事務&#xff08;Transaction&#xff09;是一組由數據庫管理系統&#xff08;DBMS&#xff09;執行的一個或多個SQL語句的集合&#xff0c;這些SQL語句作為一個單獨的工作單元執行。事務的主要目的是確保數據庫的一致性和完整性&#xff0c…

藍橋杯2023(十四屆)省賽——飛機降落(雙馬尾DFS)

飛機降落&#xff08;DFS&#xff09; 藍橋杯2023年第十四屆省賽真題-飛機降落 - C語言網 (dotcpp.com) 一開始我是真的沒想到用DFS做&#xff0c;我還在想用什么策略排序呢。需要再刷&#xff01;&#xff01;&#xff01; 雙馬尾的意思其實是刷了兩次... 一刷&#xff1a…

leecode 637 二叉樹的層平均值

leetcode 二叉樹相關-層序遍歷專題 二叉樹的層序遍歷一般來說&#xff0c;我們是利用隊列來實現的&#xff0c;先把根節點入隊&#xff0c;然后在出隊后將其對應的子節點入隊&#xff0c;然后往復此種操作。相比于二叉樹的遍歷遞歸&#xff0c;層序遍歷比較簡單&#xff0c;有…

CHI協議_1

作者&#xff1a;someone鏈接&#xff1a;https://www.zhihu.com/question/304259901/answer/3455648666來源。 1. AMBA CHI簡介 一致性總線接口&#xff08;CHI&#xff09;是AXI一致性擴展&#xff08;ACE&#xff09;協議的演進。它是Arm的AMBA總線的一部分。AMBA是一種免…

美團Java社招面試題真題,最新面試題

如何處理Java中的內存泄露&#xff1f; 1、識別泄露&#xff1a; 使用內存分析工具&#xff08;如Eclipse Memory Analyzer Tool、VisualVM&#xff09;來識別內存泄露的源頭。 2、代碼審查&#xff1a; 定期進行代碼審查&#xff0c;關注靜態集合類屬性和監聽器注冊等常見內…

VueJS ReactJS實現AI問答小助手(2)——流式TTS文字轉實時語音播放

TTS(Text-to-speech)文字轉語音使用的是阿里云的服務,文檔地址: https://help.aliyun.com/zh/isi/developer-reference/streaming-text-tts-wss 文檔只給出了一些配置項的說明,以及java端的代碼示例,但沒有web端的。所以這篇筆記可以給web開發者參考。 首先,AI答復的消息…

.NET File Upload

VS2022 .NET8 &#x1f4be;基礎上傳示例 view {ViewData["Title"] "File Upload"; }<h1>ViewData["Title"]</h1><form method"post" enctype"multipart/form-data" action"/Home/UploadFile"…

Android 系統日志(Log) JNI實現流程源碼分析

1、JNI概述 Java Native Interface (JNI) 是一種編程框架&#xff0c;使得Java代碼能夠與用其他編程語言&#xff08;如C和C&#xff09;編寫的本地代碼進行交互。JNI允許Java代碼調用本地代碼的函數&#xff0c;也允許本地代碼調用Java代碼的函數。下面是對JNI機制的詳細概述…

【單片機】STM32F070F6P6 開發指南(一)STM32建立HAL工程

文章目錄 一、基礎入門二、工程初步建立三、HSE 和 LSE 時鐘源設置四、時鐘系統&#xff08;時鐘樹&#xff09;配置五、GPIO 功能引腳配置六、配置 Debug 選項七、生成工程源碼八、生成工程源碼九、用戶程序下載 一、基礎入門 f0 pack下載&#xff1a; https://www.keil.arm…

【OpenCV 基礎知識 19】拉普拉斯變換

功能&#xff1a; cvLaplace 是計算圖像的 Laplacian 變換 &#xff0c;是Intel開源項目opencv中的函數 函數形式&#xff1a; void cvLaplace( const CvArr* src, CvArr* dst, int aperture_size3 ); 參數列表&#xff1a; Src 輸入圖像. Dst 輸出圖像. aperture_size算子內…

離線初始化k8s

導出和導入所有必要的 Kubernetes 鏡像&#xff0c;使用阿里云作為源。 在能訪問外網的機器上拉取鏡像 首先&#xff0c;在有外網訪問的機器上運行以下命令來拉取所有 Kubernetes v1.29.5 版本需要的鏡像&#xff1a; kubeadm config images pull --image-repository regist…

大模型應用:基于Golang實現GPT模型API調用

1.背景 當前OpenAI提供了開放接口&#xff0c;支持通過api的方式調用LLM進行文本推理、圖片生成等能力&#xff0c;但目前官方只提供了Python SDK。為了后續更方便集成和應用&#xff0c;可以采用Golang對核心推理調用接口進行封裝&#xff0c;提供模型調用能力。 2.相關準備…

Spark運行模式詳解

Spark概述 Spark 可以在多種不同的運行模式下執行&#xff0c;每種模式都有其自身的特點和適用場景。 部署Spark集群大體上分為兩種模式&#xff1a;單機模式與集群模式。大多數分布式框架都支持單機模式&#xff0c;方便開發者調試框架的運行環境。但是在生產環境中&#xff…

軟件web化的趨勢

引言 在信息技術飛速發展的今天&#xff0c;軟件Web化已成為一個不可忽視的趨勢。所謂軟件Web化&#xff0c;即將傳統的桌面應用軟件轉變為基于Web的應用程序&#xff0c;使用戶能夠通過瀏覽器進行訪問和使用。傳統軟件通常需要在用戶的計算機上進行安裝和運行&#xff0c;而W…

Cadence OrCAD學習筆記(3)capture使用技巧_1

本期介紹capture的一些使用技巧。資料來源于小破站up主硬小二 1、導出像Visio規格的圖紙 2、全局修改元件屬性 然后保存、關閉即可。 3、導出BOM 4、導出網表 5、元件自動編號 6、capture軟件和allegro關聯 7、新建原理圖symbol 以上為添加封裝庫的路徑 如果要創建多部分的sy…

積累|新質生產力之地方發展的不同賽道

“不要搞一種模式”。任何事物都是共性和個性的統一&#xff0c;也就是矛盾普遍性和特殊性的統一。就發展新質生產力而言&#xff0c;既要遵循新質生產力的普遍規律和共同特征&#xff0c;又要充分考慮各地、各產業的實際情況和特殊性&#xff0c;準確把握共性與個性。 總述 …

神器EasyRecovery2024中文電腦版下載!讓數據恢復不再難

在數字化時代&#xff0c;數據就是我們的財富。無論是重要的工作報告&#xff0c;還是那些珍貴的生活瞬間照片&#xff0c;或是我們與朋友間的聊天記錄&#xff0c;都儲存在我們的電腦或手機中。然而&#xff0c;有時候&#xff0c;意外總是突如其來&#xff0c;電腦突然崩潰&a…

C++Qt操作Lotus Domino數據庫 Lotus Domino C++連接Lotus Domino C++快速開發Lotus Domino

java連接domino C#連接domino python連接domino go連接domino,delphi連接domino Excel連接domino Flutter、微信小程序連接domino C 操作 Lotus Domino 數據庫&#xff1a;自動化與效率的結合 引言 在企業級應用中&#xff0c;Lotus Domino 提供了一個強大的協作平臺&#xff0…

【Linux】TCP協議【下一】{三次握手/四次揮手的深度解讀==狀態變化}

文章目錄 本篇知識需要有TCP協議【中】的知識&#xff01;詳情點擊&#x1f447;1.測試一&#xff1a;服務器start函數不定義任何行為&#xff08;不調用accept&#xff09;的三次握手狀態變化int listen(int sockfd, int backlog);的backlog參數全連接隊列當全連接隊列已滿&am…