亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 JVM 入門教程 JVM 入門教程 Class 文件的訪問標志與索引

Class 文件的訪問標志與索引

1. 前言

本節內容主要是介紹 Class 文件結構中的訪問標志與索引,其中索引又細分為類索引、父類索引、接口索引計數器、接口索引集合四個知識點。本節主要知識點如下:

  • 訪問標志的定義及意義,以及結構示意圖,為本節重點內容之一;
  • 訪問標志的標記類型及標記值對應表,為本節的次重點內容;
  • 類索引、父類索引、接口索引計數器、接口索引集合的定義及示意圖,為本節內容之一。

本節的索引過程講解對于初學者來說會有一定的難度,講解過程也會涉及到之前所學習的常量池知識,學習者需要結合之前所學知識去理解索引,并進一步的加深對常量池的認識。

2. 訪問標志(access_flags)

Tips:前文在講解常量池部分的最后提出過問題,Class文件結構的常量池后邊緊跟的是什么結構呢?訪問標志,就是我們尋求的答案。

定義:在常量池結束之后,緊接著的 2 個字節代表訪問標志(access_flags),訪問標志用于識別一些類或接口層次的訪問信息。

從定義的描述中我們可以了解到,訪問標志也是無符號數類型的數據,既然訪問標志占用了 2 個字節,那么訪問標志的占用空間也可用 u2 來表示。

無符號數結構示意圖

圖片描述

從上圖中,我們能夠清晰的看到訪問標志占用了 2 個字節,是類似于我們之前所學習的常量池計數器的,因為常量池計數器也是占用了 2 個字節,均為 u2 大小。

3. 訪問標志類型對應表

這部分內容為次重點內容,通過對這部分的學習,學習者需要了解訪問標志的不同類型,以及不同類型的訪問標志的意義。我們先來看下對應表,后續我會舉例說明。

標志類型 對應標志值 標志意義
ACC_PUBLIC 0x0001 是否為 public 類型
ACC_FINAL 0x0010 是否被聲明為 final 類型
ACC_SUPER 0x0020 是否允許使用 invokespcial 字節碼指令的新語義
ACC_INTERFACE 0x0200 標識這是一個接口
ACC_ABSTRACT 0x0400 是否為抽象類型
ACC_SYNTHETIC 0x1000 標識這個類并非由用戶代碼生成
ACC_ANNOTATION 0x2000 標識這是一個注解
ACC_ENUM 0x4000 標識這是一個枚舉

我們舉個簡單的例子來理解下訪問標志以及這張對應表。假設需要訪問一個接口,那么此時訪問標志 ACC_INTERFACE 的值為 true,標志對應的值為 0x0200。這樣 JVM 虛擬機在處理訪問的時候,就能夠做到有據可依。

4. 類索引與父類索引

定義:類索引(this_class)和父類索引(super_class)都是一個 u2 大小的數據。

  • 類索引:確定當前類的全限定名。
  • 父類索引:確定當前類的父類的全限定名。

Tips:由于 Java 單繼承的原則,父類只可能有一個;由于 Object 是所有其他類的基類,所以除了 Object 類沒有父類以外,其余所有類的 super_class 都不為空。

無符號數結構示意圖:類索引是緊跟在訪問標志之后的結構,類索引后邊緊跟的結構是父類索引。由于類索引與父類索引關系非常緊密,都是描述的當前類以及當前類的父類的全限定名,所以此處我們將二者放在一起進行講解。

圖片描述

5. 接口索引計數器與接口索引集合

父類索引后邊緊跟的是接口索引計數器,接口索引計數器后邊緊跟的是接口索引集合。類似于常量池計數器和常量池的關系,接口索引計數器記錄的是接口索引集合中接口索引的數量。

Tips:對于常量池計數器和常量池,一個是無符號數類型,一個是表類型。相比而言,接口索引計數器和接口索引集合皆為無符號數類型,這里學習者可以進行對比記憶。我們繼續來看下兩者的定義以及無符號數類型的結構示意圖。

定義

  • 接口索引計數器:代表了接口索引集合中接口的數量;
  • 接口索引集合:按照當前類 implements(或當前接口extends)的接口的順序,從左到右依次排列在接口索引集合中,此部分集合稱為接口索引集合。

無符號數結構示意圖:接口索引計數器和接口索引集合均為無符號數類型結構,結構示意圖如下圖所示。

圖片描述

從圖中可以看出,接口索引計數器占用了 2 個字節,為 u2 大小,接口索引集合中的每一個接口元素占用了 2 個字節大小,也為 u2 大小。

Tips:接口索引集合后邊緊跟的數據結構是什么?我們繼續拋出問題,后續章節會有問題的解答,讓我們帶著問題繼續探究 Class 文件結構。

6. 小結

本節講解了 Class 文件結構中的訪問標志與索引,其中索引我們又細分了四部分結構進行了講解,分別是類索引,父類索引,接口索引計數器以及接口索引集合。通過本節的學習,我們了解了它們的定義及意義,也了解了它們的數據類型及示意圖。

本節我們也拋出了問題,接口索引集合后邊緊跟的結構是什么?我們會在下篇課程中進行講解。本節所了解到的訪問標志與索引相關知識均為重點內容,學習者需要用心掌握。