Java Class檔案格式access_flags 描述的是當前類(或者介面)的訪問修飾符, 如public, private等, 此外, 這裡面還存在一個標誌位, 標誌當前的額這個class描述的
阿新 • • 發佈:2019-02-09
access_flags 描述的是當前類(或者介面)的訪問修飾符, 如public, private等, 此外, 這裡面還存在一個標誌位, 標誌當前的額這個class描述的是類, 還是介面。access_flags 的資訊比較簡單, 下面列出access_flags 中的各個標誌位的資訊。本來寫這個系列部落格參考的是《深入java虛擬機器》, 但是這本書比較老了, 關於java 5以後的新特性沒有進行解釋,這本書中指列出了5個標誌值,
而最新的JVM規範是針對java 7 的, 其中加入了額外的三個標誌位。 分別是ACC_SYNTHETIC, ACC_ANNOTATION 和 ACC_ENUM 。
其他標誌就不做介紹了, 這些標誌都很簡單。 讀者感覺比較陌生的可能是ACC_SUPER這個標誌。 讀者會想, 型別不能被super關鍵字修飾啊, 那這個ACC_SUPER是做什麼的呢?表中可以看出, 它的含義是:使用新的invokespecial語義 。 invokespecial是一個位元組碼指令, 用於呼叫一個方法, 一般情況下, 呼叫構造方法或者使用super關鍵字顯示呼叫父類的方法時,
會使用這條位元組碼指令。 這正是ACC_SUPER這個名字的由來。 在java 1.2之前, invokespecial對方法的呼叫都是靜態繫結的, 而ACC_SUPER這個標誌位在java 1.2的時候加入到class檔案中, 它為invokespecial這條指令增加了動態繫結的功能。 這裡可能有幾個概念讀者不是很明白, 如靜態繫結, 動態繫結等, 這些概念會在以後的部落格中詳細介紹。
還有一點需要說明, 既然access_flags 出現在class檔案中的類的層面上, 那麼它只能描述型別的修飾符, 而不能描述欄位或方法的修飾符, 希望讀者不要將這裡的access_flags 和後面要介紹的方法表和欄位表中的訪問修飾符相混淆。
此外, 在Java 5 的中, 引入和註解和列舉的新特性, 那麼可以推測, ACC_ANNOTATION 和 ACC_ENUM是在Java 5版本中加入的。 class檔案雖然總體上保持前後一致性, 但他也不是一成不變的, 也會跟著Java版本的提升而有所改變, 但是總體來說, class檔案格式還是相對穩定的, 變動的地方不是很多。
標誌名 |
標誌值 | 標誌含義 | 針對的對像 |
ACC_PUBLIC | 0x0001 | public型別 | 所有型別 |
ACC_FINAL | 0x0010 | final型別 | 類 |
ACC_SUPER | 0x0020 | 使用新的invokespecial語義 | 類和介面 |
ACC_INTERFACE | 0x0200 | 介面型別 | 介面 |
ACC_ABSTRACT | 0x0400 | 抽象型別 | 類和介面 |
ACC_SYNTHETIC | 0x1000 | 該類不由使用者程式碼生成 | 所有型別 |
ACC_ANNOTATION | 0x2000 | 註解型別 | 註解 |
ACC_ENUM | 0x4000 | 列舉型別 | 列舉 |