1. 程式人生 > >Java Class檔案格式access_flags 描述的是當前類(或者介面)的訪問修飾符, 如public, private等, 此外, 這裡面還存在一個標誌位, 標誌當前的額這個class描述的

Java Class檔案格式access_flags 描述的是當前類(或者介面)的訪問修飾符, 如public, private等, 此外, 這裡面還存在一個標誌位, 標誌當前的額這個class描述的

access_flags 描述的是當前類(或者介面)的訪問修飾符, 如public, private等, 此外, 這裡面還存在一個標誌位, 標誌當前的額這個class描述的是類, 還是介面。access_flags 的資訊比較簡單, 下面列出access_flags 中的各個標誌位的資訊。本來寫這個系列部落格參考的是《深入java虛擬機器》, 但是這本書比較老了, 關於java 5以後的新特性沒有進行解釋,這本書中指列出了5個標誌值, 而最新的JVM規範是針對java 7 的, 其中加入了額外的三個標誌位。 分別是ACC_SYNTHETIC, ACC_ANNOTATION 和 ACC_ENUM  。

標誌名

標誌值 標誌含義 針對的對像
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 列舉型別 列舉
其他標誌就不做介紹了, 這些標誌都很簡單。 讀者感覺比較陌生的可能是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檔案格式還是相對穩定的, 變動的地方不是很多。