最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java class文件格式之訪問標志信息_動力節(jié)點Java學院整理

 更新時間:2017年06月14日 14:14:42   作者:zhangjg  
access_flags 描述的是當前類(或者接口)的訪問修飾符, 如public, private等, 此外, 這里面還存在一個標志位, 標志當前的額這個class描述的是類, 還是接口

class文件中的訪問標志信息

位于常量池下面的2個字節(jié)是access_flags 。 access_flags 描述的是當前類(或者接口)的訪問修飾符, 如public, private等, 此外, 這里面還存在一個標志位, 標志當前的額這個class描述的是類, 還是接口。access_flags 的信息比較簡單, 下面列出access_flags 中的各個標志位的信息。本來寫這個系列博客參考的是《深入java虛擬機》, 但是這本書比較老了, 關于java 5以后的新特性沒有進行解釋,這本書中指列出了5個標志值, 而最新的JVM規(guī)范是針對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是一個字節(jié)碼指令, 用于調用一個方法, 一般情況下, 調用構造方法或者使用super關鍵字顯示調用父類的方法時, 會使用這條字節(jié)碼指令。 這正是ACC_SUPER這個名字的由來。 在java 1.2之前, invokespecial對方法的調用都是靜態(tài)綁定的, 而ACC_SUPER這個標志位在java 1.2的時候加入到class文件中, 它為invokespecial這條指令增加了動態(tài)綁定的功能。 這里可能有幾個概念讀者不是很明白, 如靜態(tài)綁定, 動態(tài)綁定等, 這些概念會在以后的博客中詳細介紹。

還有一點需要說明, 既然access_flags 出現在class文件中的類的層面上, 那么它只能描述類型的修飾符, 而不能描述字段或方法的修飾符, 希望讀者不要將這里的access_flags 和后面要介紹的方法表和字段表中的訪問修飾符相混淆。

此外, 在Java 5 的中, 引入和注解和枚舉的新特性, 那么可以推測,  ACC_ANNOTATION 和 ACC_ENUM是在Java 5版本中加入的。 class文件雖然總體上保持前后一致性, 但他也不是一成不變的, 也會跟著Java版本的提升而有所改變, 但是總體來說, class文件格式還是相對穩(wěn)定的, 變動的地方不是很多。 

class文件中的this_class

訪問標志access_flags 下面的兩個字節(jié)叫做this_class, 它是對當前類的描述。 它的兩個字節(jié)的數據是對常量池中的一個CONSTANT_Class_info數據項的一個索引。 CONSTANT_Class_info在上面的文章中已經介紹過了。 CONSTANT_Class_info中有一個字段叫做name_index , 指向一個CONSTANT_Utf8_info , 在這個CONSTANT_Utf8_info 中存放著當前類的全限定名。 

如果當前類為Person:

package combjpowernodetest; 
 
public class Person { 
 
 int age; 
 
 int getAge(){ 
  return age; 
 } 
} 

將Person.class反編譯后, 可以在常量池中看到如下兩項:

 Constant pool: 
 #1 = Class    #2    // com/bjpowernode/test/Person 
 #2 = Utf8    com/bjpowernode/test/Person 
  
......... 
......... 

這兩項就是當前類的信息。 其中索引為1的CONSTANT_Class_info會被class文件中的this_class所引用。 下面給出示例圖(其中虛線范圍內表示常量池的區(qū)域):

 

class文件中的super_class

super_class緊跟在this_class之后。 它和this_class一樣是一個指向常量池數據項的索引。 它指向一個CONSTANT_Class_info, 這個CONSTANT_Class_info數據項描述的是當前類的超類的信息。CONSTANT_Class_info中的name_index指向常量池中的一個CONSTANT_Utf8_info ,CONSTANT_Utf8_info 中存放的是當前類的超類的全限定名。 如果沒有顯式的繼承一個,也就是說如果當前類是直接繼承Object的, 那么super_class值為0 。 我們在前面的文章中提到過, 如果一個索引值為0, 那么就說明這個索引不引用任何常量池中的數據項, 因為常量池中的數據項是從1開始的。 也就是說, 如果一個類的class文件中的super_class為0 , 那么就代表該類直接繼承Object類。 

下面以代碼來說明:

package combjpowernodetest; 
 
public class Programer extends Person{ 
 
 Computer computer; 
  
 public Programer(Computer computer){ 
  thiscomputer = computer; 
 } 
  
 public void doWork(){ 
  computercalculate(); 
 } 
} 

上面的Programer類繼承自Person類。 那么反編譯Programer .class , 它的常量池中會存在如下信息:

Constant pool: 
 
......... 
......... 
 
 #3 = Class    #4    // com/bjpowernode/test/Person 
 #4 = Utf8    com/bjpowernode/test/Person 

這兩項就是當前類的父類的信息。 其中索引為3的CONSTANT_Class_info會被class文件中的super_class引用。 下面給出示例圖(其中虛線范圍內表示常量池的區(qū)域):

class文件中的interfaces_count和interfaces

緊接著super_class的是interfaces_count, 表示當前類所實現的接口的數量或者當前接口所繼承的超接口的數量。 注意, 只有當前類直接實現的接口才會被統(tǒng)計, 如果當前類繼承了另一個類, 而另一個類又實現了一個接口, 那么這個接口不會統(tǒng)計在當前類的interfaces_count中。 在interfaces_count后面是interfaces, 他可以看做是一個數組, 其中的每個數組項是一個索引, 指向常量池中的一個CONSTANT_Class_info, 這個CONSTANT_Class_info又會引用常量池中的一個CONSTANT_Utf8_info , 這個CONSTANT_Utf8_info 中存放著有當前類型直接實現或繼承的接口的全限定名。 當前類型實現或繼承了幾個接口, 在interfaces數組中就會有幾個數項與之相對應。 

下面看代碼示例:

package combjpowernodetest; 
 
public class Plane implements IFlyable, Cloneable{ 
 
 @Override 
 public void fly() { 
   
 } 
} 

Plane類實現了一個自定義的IFlyable接口, 還實現了一個JDK中的Cloneable接口, 那么它的常量池中會有如下信息:

Constant pool: 
 
......... 
......... 
 
 #5 = Class    #6    // com/bjpowernode/test/IFlyable 
 #6 = Utf8    com/bjpowernode/test/IFlyable 
 #7 = Class    #8    // java/lang/Cloneable 
 #8 = Utf8    java/lang/Cloneable 
  
......... 
......... 

這四項數據就是當前的Plane類所實現的接口的信息。 第五項和第六項描述了Plane所實現的IFlyable接口, 第七項和第八項描述了Plane所實現的接口Cloneable接口。 下面是示意圖(其中虛線范圍內表示常量池的區(qū)域):

總結

主要講解了三個部分, 分別是this_class , super_class , interfaces_count和interfaces 。 這三個數據項分別描述了當前類(就是當前class文件所在的類), 當前類所繼承的超類, 和當前類所實現的接口(如果當前class文件代表的是一個接口, 那么 interfaces_count和interfaces描述的是當前接口所繼承的超接口)。

這幾個數據項都持有指向常量池的索引。 真實的信息都是存放在常量池中的, 只不過常量池中的這些信息會被this_class , super_class , interfaces_count和interfaces 引用。

相關文章

  • idea中git如何修改commit(ChangeList的使用)

    idea中git如何修改commit(ChangeList的使用)

    這篇文章主要介紹了idea中git如何修改commit(ChangeList的使用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Dwr3.0純注解(純Java Code配置)配置與應用淺析二之前端調用后端

    Dwr3.0純注解(純Java Code配置)配置與應用淺析二之前端調用后端

    我們講到了后端純Java Code的Dwr3配置,完全去掉了dwr.xml配置文件,但是對于使用注解的類卻沒有使用包掃描,而是在Servlet初始化參數的classes里面加入了我們的Service組件的聲明暴露,對于這個問題需要后面我們再細細研究下這篇文章,主要分析介紹前端怎么直接調用后端
    2016-04-04
  • Mybatis返回單個實體或者返回List的實現

    Mybatis返回單個實體或者返回List的實現

    這篇文章主要介紹了Mybatis返回單個實體或者返回List的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 使用Java7的Files工具類和Path接口來訪問文件的方法

    使用Java7的Files工具類和Path接口來訪問文件的方法

    下面小編就為大家分享一篇使用Java7的Files工具類和Path接口來訪問文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • spring boot 常見http請求url參數獲取方法

    spring boot 常見http請求url參數獲取方法

    這篇文章主要介紹了spring boot 常見http請求url參數獲取,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 關于Socket的解析以及雙方即時通訊的java實現方法

    關于Socket的解析以及雙方即時通訊的java實現方法

    本篇文章主要介紹了關于Socket的解析以及雙方通訊的java實現方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 使用開源項目JAVAE2 進行視頻格式轉換

    使用開源項目JAVAE2 進行視頻格式轉換

    這篇文章主要介紹了使用開源項目JAVAE 進行視頻格式轉換,幫助大家更好的利用Java處理視頻,完成自身需求,感興趣的朋友可以了解下
    2020-11-11
  • SpringBoot解決yml明文密碼問題的方法

    SpringBoot解決yml明文密碼問題的方法

    在現代的軟件開發(fā)中,安全性是一個重要的考量因素,對于使用SpringBoot框架開發(fā)的應用程序而言,敏感信息如數據庫密碼、API密鑰等通常存儲在YAML配置文件中,而這些文件往往是明文存儲,存在安全隱患,所以本文介紹了SpringBoot解決yml明文密碼問題的方法
    2024-07-07
  • java關于字符串的常用API

    java關于字符串的常用API

    字符串其實就是一串連續(xù)的字符,它是由許多單個字符連接而成的。如多個英文字母所組成的一個英文單詞。字符串中可以包含任意字符,這些字符必須包含在一對雙引號之內,今天就來介紹字符串常用的API
    2023-05-05
  • java swing實現貪吃蛇雙人游戲

    java swing實現貪吃蛇雙人游戲

    這篇文章主要為大家詳細介紹了java swing實現貪吃蛇雙人小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01

最新評論

若羌县| 宕昌县| 科尔| 栾城县| 德清县| 秭归县| 来凤县| 镇原县| 习水县| 百色市| 南澳县| 驻马店市| 射洪县| 洛宁县| 和林格尔县| 万州区| 吉安市| 南平市| 西乌| 深圳市| 寿宁县| 应用必备| 松潘县| 上虞市| 西安市| 余姚市| 兴义市| 彰武县| 屏山县| 古交市| 安阳市| 嘉黎县| 建湖县| 澄江县| 兴安盟| 古丈县| 藁城市| 谷城县| 巧家县| 区。| 大丰市|