一、訪問標誌的概念
常量池結束之後,緊接着的兩個字節代表訪問標誌,這個標誌用於識別一些類或者接口層次的訪問信息,包括:這個Class是接口還是類;是否被定義爲public類型;是否定義爲abstract類型;如果是類的話,是否被聲明爲final等。
access_flages中共有兩個字節(16位)可以使用,沒有使用到的標誌爲要求一律爲0。如果有多個訪問標誌,那通過“OR”的方式組合在一起。
二、訪問標誌具體含義
標誌名稱 | 標誌值 | 含義 |
ACC_PUBLIC | 0x00 01 | 是否爲Public類型 |
ACC_FINAL | 0x00 10 | 是否被聲明爲final,只有類可以設置 |
ACC_SUPER | 0x00 20 | 是否允許使用invokespecial字節碼指令的新語義. |
ACC_INTERFACE | 0x02 00 | 標誌這是一個接口 |
ACC_ABSTRACT | 0x04 00 | 是否爲abstract類型,對於接口或者抽象類來說,次標誌值爲真,其他類型爲假 |
ACC_SYNTHETIC | 0x10 00 | 標誌這個類並非由用戶代碼產生 |
ACC_ANNOTATION | 0x20 00 | 標誌這是一個註解 |
ACC_ENUM | 0x40 00 | 標誌這是一個枚舉 |
三、實例分析
案例一
定義一個類:
public class HelloWord {
}
00 21可以推斷是由ACC_PUBLIC和ACC_SUPER通過OR組合而成。
通過命令javap -verbose HelloWord.class來查看,發現確實是 ACC_PUBLIC, ACC_SUPER組合而成:
案例二
定義一個接口:
public interface HelloWord {
}
06 01又是怎麼組合的呢?通過命令javap -verbose HelloWord.class來查看,發現是 ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT組合而成:
參考資料: