Class文件解讀(三)

接上篇:http://www.javashuo.com/article/p-xgfqiwgf-kz.htmljava

訪問標誌(access_flags)this

        在常量池結束以後,緊接着的兩個字節表明訪問標誌,這個標誌用於識別一些類或者接口層次的訪問信息,包括:這個Class是類仍是接口:是否認義爲public類型;是否認義爲abstract類型;若是是類的話,是否被聲明爲final等。具體的標誌位及標誌的含義見表1。spa

表1 訪問標誌.net

標誌名稱 標誌值 含義
ACC_PUBLIC Ox0001 是否爲public類型
ACC_FINAL Ox0010 是否被聲明爲final,只有類可設置
ACC_SUPER Ox0020 是否容許使用invokespecial字節碼指令的新語意,invokespecial指的語意在JDK 1.0.2發生過改變,爲了區分這條指令使用哪一種語意,JDK 1.0.2以後編譯出來的類的這個標誌都必須爲真
ACC_INSTERFACE Ox0200 標識這是一個接口
ACC_ABSTRACT Ox0400 是否爲abstract類型,對於接口或者抽象類來講,此標誌位真,其餘類型爲假
ACC_SYNTHETIC Ox1000 標誌這個類並不是由用戶代碼產生的
ACC_ANNOTATION Ox2000 標識這個一個註解
ACC_ENUM Ox4000 標識這是一個枚舉類

      access_flags中一共有16個標誌位可使用,當前只定義了其中8個,沒有使用到的標誌位要求一概爲0。以本系列文章中的代碼爲例,TestClass是一個普通java類,不是接口、枚舉或者註解,被public關鍵字修飾但沒有被聲明爲final和abstract,而且它使用了JDK 1.2以後的編譯器進行編譯,所以它的ACC_PUBLIC、ACC_SUPER爲真,ACC_FINAL、ACC_INSTERFACE、ACC_ABSTRACT、ACC_SYNTHETIC、ACC_ANNOTATION、ACC_ENUM這6個標誌應當爲假,所以它的access_flags的值應爲Ox0001|Ox0020=Ox0021,在本例Class文件中可查看到該類的訪問標誌值的確爲Ox0021(偏移地址:Ox00000100,偏移量:0)blog

類索引、父類索引與接口索引集合繼承

     類索引(this_class)和父類索引(super_class)都是一個u2類型的數據,而接口索引集合(interfaces)是一組u2類型的數據集合,Class文件中由這三項數據來肯定類的繼承關係,類索引用於肯定這個類的全限定名,父類索引用於肯定這個類父類的全限定名,因爲java語言不容許多重繼承,因此父類索引只有一個,除了java.lang.Object以外,全部的Java類都有父類,也就是說除了java.lang.Object以外全部的父類索引都不爲0。接口索引集合用來表示這個類實現的接口狀況,這些被實現的接口將按implements語句(若是這個類自己是一個接口,則應當是extends語句)後的接口順序從左到右排列在接口索引集合中。索引

類索引、父類索引和接口索引集合都按順序排列在訪問標誌位以後,類索引和父類索引用兩個u2類型的索引值表示,他們各指向一個類型爲CONSTANT_Class_info的類描述符常量,經過CONSTANT_Class_info類型的常量中的索引值能夠找到定義在CONSTANT_Utf8_info類型的常量中的全限定名字符串。對於接口索引集合,入口的第一項——u2類型的數據爲接口計數器(interfaces_count),表示索引表的容量,若是該類沒有實現任何接口,則該計數器值爲0,後面接口的索引表再也不佔用任何字節。接口

        從上圖中能夠看到該Class文件中,類索引、父類索引、接口索引集合偏移地址均爲Ox00000100,值分別爲Ox000二、Ox000四、Ox0000(無接口索引表),經過上面對各索引項的解釋及結合本系列第二篇針對常量池進行具體講解的博客篇(https://my.oschina.net/u/3345762/blog/880152)能夠了解到該Class文件中類索引指向的常量值爲org/lucas/clazz/TestClass,父類索引指向的常量值爲java/lang/Object,接口索引集合爲空。ci

下篇:http://www.javashuo.com/article/p-pjhsbtkd-kz.html字符串

相關文章
相關標籤/搜索