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 文件結構中的訪問標志與索引,其中索引我們又細分了四部分結構進行了講解,分別是類索引,父類索引,接口索引計數器以及接口索引集合。通過本節的學習,我們了解了它們的定義及意義,也了解了它們的數據類型及示意圖。
本節我們也拋出了問題,接口索引集合后邊緊跟的結構是什么?我們會在下篇課程中進行講解。本節所了解到的訪問標志與索引相關知識均為重點內容,學習者需要用心掌握。