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

Java class文件格式之方法_動力節(jié)點Java學院整理

 更新時間:2021年09月09日 09:15:28   作者:zhangjg  
這篇文章主要為大家詳細介紹了Java class文件格式之方法的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下

class文件中的fields_count和fields

fields_count描述的是當前的類中定義的字段的個數(shù),注意,這里包括靜態(tài)字段, 但不包括從父類繼承的字段。如果當前class文件是由一個接口生成的, 那么這里的fields_count描述的是接口中定義的字段, 我們知道,接口中定義的字段默認都是靜態(tài)的。此外要說明的是,編譯器可能會自動生成字段,也就是說, class文件中的字段的數(shù)量可能多于源文件中定義的字段的數(shù)量。舉例來說,編譯器會為內部類增加一個字段, 這個字段是指向外圍類的對象的引用。

位于fields_count下面的數(shù)據(jù)叫做fields, 可以把它看做一個數(shù)組, 數(shù)組中的每一項是一個field_info 。這個數(shù)組中一共有fields_count個field_info , 每個field_info都是對一個字段的描述。 下面我們詳細講解field_info的結構。 每個field_info的結構如下:

(1)access_flags

其中access_flags占兩個字節(jié), 描述的是字段的訪問標志信息。 這里就不在詳細介紹了, 下面給出一張表格(該表格來自《深入Java虛擬機》):

(2)name_index

access_flags下面的兩個字節(jié)是name_index, 這是一個指向常量池的索引, 它描述的是當前字段的字段名。 這個索引指向常量池中的一個CONSTANT_Utf8_info數(shù)據(jù)項。 這個CONSTANT_Utf8_info數(shù)據(jù)項中存放的字符串就是當前字段的字段名。 

(3)descriptor_index

name_index下面的兩個字節(jié)叫做descriptor_index , 它同樣是一個指向常量池的索引, 它描述的是當前字段的描述符。 這個索引指向常量池中的一個CONSTANT_Utf8_info數(shù)據(jù)項。 這個CONSTANT_Utf8_info數(shù)據(jù)項中存放的字符串就是當前字段的描述符。

(4)attributes_count和attributes

descriptor_index 下面是attributes_count和attributes 。 這是對當前字段所具有的屬性的描述。 這里的屬性和源文件中的屬性不是同一個概念, 在源文件測層面中, 屬性是字段的另一種叫法, 希望讀者不要疑惑。讀者也不要輕視class文件中的屬性, 這些屬性可以描述很多的信息。 我們會在后面的文章中進行介紹。

attributes_count表示這個字段有幾個屬性。attributes 可以看成一個數(shù)組, 數(shù)組中的每一項都是一個attribute_info,每個attribute_info 表示一個屬性, 數(shù)組中一共有attributes_count個屬性??梢猿霈F(xiàn)在filed_info中的屬性有三種,分別是ConstantValue, Deprecated, 和 Synthetic。 這些屬性會在后面的文章中進行介紹。

下面我們以代碼的形式進行解釋,源碼如下:

package com.bjpowernode.test; 

public class Programer extends Person{ 
 
 private Computer computer; 
 
 public Programer(Computer computer){ 
  this.computer = computer; 
 } 
 
public void doWork(){ 
  computer.calculate(); 
 } 
}

反編譯之后, 常量池中會有如下信息(這里省略了大部分無關信息):

Constant pool: 
 
......... 
......... 
 
 #5 = Utf8    computer 
 #6 = Utf8    Lcom/jg/zhang/Computer; 
 
......... 
......... 
 
{ 
 
 private com.jg.zhang.Computer computer; 
 flags: ACC_PRIVATE 
 
......... 
......... 
 
} 

從反編譯的結果可以看出,源文件中定義了一個Computer類型的字段computer,并且是private的。然后常量池中有這個字段的字段名和描述符。 其中常量池第五項的CONSTANT_Utf8_info是字段名,第六項的CONSTANT_Utf8_info是該字段的描述符。這里有一點需要說明,在反編譯Programer.class時,由于computer是私有的, 要加- private選項,否則的話,雖然常量池中有字段引用信息, 但是不會輸出字段信息, 即下面這兩行不會輸出:

private com.bjpowernode.test.Computer computer; 
flags: ACC_PRIVATE 

如果在javap中加入 - private選項, 那么就會有上面兩行的輸出。 使用的命令如下:

javap -c -v -private -
classpath . com.bjpowernode.test.Programer 

 根據(jù)反編譯的結果,可以下面給出示意圖, 該圖說明了與computer相對應的field_info是不合引用常量池的 ( 其中虛線范圍內表示常量池):

class文件中的methods_count和methods

fields下面的信息是methods_count和methods 。 methods_count描述的是當前的類中定義的方法的個數(shù), 注意, 這里包括靜態(tài)方法, 但不包括從父類繼承的方法。 如果當前class文件是由一個接口生成的, 那么這里的methods_count描述的是接口中定義的抽象方法的數(shù)量, 我們知道, 接口中定義的方法默認都是公有的。此外需要說明的是, 編譯器可能會在編譯時向class文件增加額外的方法, 也就是說, class文件中的方法的數(shù)量可能多于源文件中由用戶定義的方法。 舉例來說: 如果當前類沒有定義構造方法, 那么編譯器會增加一個無參數(shù)的構造函數(shù)<init>; 如果當前類或接口中定義了靜態(tài)變量, 并且使用初始化表達式為其賦值, 或者定義了static靜態(tài)代碼塊, 那么編譯器在編譯的時候會默認增加一個靜態(tài)初始化方法<clinit>。

位于methods_count下面的數(shù)據(jù)叫做methods,可以把它看做一個數(shù)組, 數(shù)組中的每一項是一個method_info。這個數(shù)組中一共有methods_count個method_info,每個method_info 都是對一個方法的描述。 下面我們詳細講解method_info的結構。每個method_info 的結構如下,幾乎和field_info的結構是一樣的:

(1)access_flags

 其中access_flags占兩個字節(jié), 描述的是方法的訪問標志信息。 這里就不在詳細介紹了, 下面給出一張表格(該表格來自《深入Java虛擬機》):

(2)name_index

access_flags下面的兩個字節(jié)是name_index, 這是一個指向常量池的索引, 它描述的是當前方法的方法名。 這個索引指向常量池中的一個CONSTANT_Utf8_info數(shù)據(jù)項。 這個CONSTANT_Utf8_info數(shù)據(jù)項中存放的字符串就是當前方法的方法名。

(3)descriptor_index

name_index下面的兩個字節(jié)叫做descriptor_index , 它同樣是一個指向常量池的索引, 它描述的是當前方法的描述符。 這個索引指向常量池中的一個CONSTANT_Utf8_info數(shù)據(jù)項。 這個CONSTANT_Utf8_info數(shù)據(jù)項中存放的字符串就是當前方法的描述符。

(4)attributes_count和attributes

descriptor_index 下面是attributes_count和attributes 。 這是對當前方法所具有的屬性的描述。 這里的屬性和源文件中的屬性不是同一個概念, 在源文件測層面中, 屬性是字段的另一種叫法, 希望讀者不要疑惑。讀者也不要輕視class文件中的屬性, 這些屬性可以描述很多的信息。 我們會在后面的文章中進行介紹。

attributes_count表示這個字段有幾個屬性。attributes 可以看成一個數(shù)組, 數(shù)組中的每一項都是一個attribute_info , 每個attribute_info 表示一個屬性, 數(shù)組中一共有attributes_count個屬性??梢猿霈F(xiàn)在method_info 中的屬性有三種, 分別是Code, Deprecated, Exceptions 和Synthetic。 在這幾個屬性中,尤其是Code和Exceptions 非常重要, 這兩個屬性對于在class文件中完整描述一個方法起著至關重要的作用,其中Code屬性中存放方法的字節(jié)面指令,Exceptions 屬性是對方法聲明中拋出的異常的描述。這兩屬性以及其他一些屬性,會在下一篇文章中詳細介紹,敬請關注。

介紹完了每個method_info的結構, 下面我們以代碼來說明, 還是使用上面的源碼:

package com.jg.zhang; 
 
public class Programer extends Person{ 
 
  
 private Computer computer; 
  
 public Programer(Computer computer){ 
  this.computer = computer; 
 } 
  
 public void doWork(){ 
  computer.calculate(); 
 } 
} 

反編譯之后, 常量池中會有如下信息(這里省略了大部分無關信息):

Constant pool: 
 
......... 
 
 #7 = Utf8    <init> 
 #8 = Utf8    (Lcom/jg/zhang/Computer;)V 
 
......... 
 
 #12 = Utf8    ()V 
 
......... 
 
 #19 = Utf8    doWork 
 
{ 
 
......... 
 
 public com.jg.zhang.Programer(com.jg.zhang.Computer); 
 flags: ACC_PUBLIC 
 
......... 
 
 public void doWork(); 
 flags: ACC_PUBLIC 
 
......... 
} 

由反編譯結果可以看出, 該類中定義了兩個方法, 其中一個是構造方法, 一個是doWork方法, 且這兩個方法都是public的。 這兩個方法的描述信息都存放在常量池。 其中第7項的CONSTANT_Utf8_info為構造方法的方法名, 第8項的CONSTANT_Utf8_info為構造方法的方法描述符, 第19項的CONSTANT_Utf8_info為doWork方法的方法名, 第12項的CONSTANT_Utf8_info為doWork方法的方法描述符。 

根據(jù)常量池中的信息, 可以得出如下的示意圖, 該示意圖形象的說明了class文件中的method_info是如何引用常量池中的數(shù)據(jù)項來描述當前類中定義的方法的。 圖中虛線范圍內表示常量池所在的區(qū)域:

總結

到此為止, 我們就介紹完了class文件中的fields和methods, 進行一下總結。 
 fields是對當前類中定義的字段的描述, 其中每個字段使用一個field_info表示, fields中有fields_count個field_info。
methods是對當前類或者接口中聲明的方法的描述, 其中每個方法使用一個method_info表示, methods中有methods_count個method_info。 

在下一篇博客中,將會介紹class文件中的各個屬性,敬請關注。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Java使用jmeter進行壓力測試

    Java使用jmeter進行壓力測試

    本篇文章簡單講一下使用jmeter進行壓力測試。其壓測思想就是 通過創(chuàng)建指定數(shù)量的線程,同時請求指定接口,來模擬指定數(shù)量用戶同時進行某個操作的場景,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Spring Boot 異步框架的使用詳解

    Spring Boot 異步框架的使用詳解

    這篇文章主要介紹了Spring Boot 異步框架的使用詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java substring方法實現(xiàn)原理解析

    Java substring方法實現(xiàn)原理解析

    這篇文章主要介紹了Java substring方法實現(xiàn)原理解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例

    SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例

    本文主要介紹了SpringBoot+mybatis+Vue實現(xiàn)前后端分離項目的示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 淺談一下Java的雙親委派模式

    淺談一下Java的雙親委派模式

    這篇文章主要介紹了一下Java的雙親委派模式,雙親委派指得是,JVM在加載類時,會委派給ExtClassLoader和BootstrapClassLoader進?加載,如果沒加載到才由??進?加載,需要的朋友可以參考下
    2023-04-04
  • SpringCloud中的Eureka注冊中心詳細解讀

    SpringCloud中的Eureka注冊中心詳細解讀

    這篇文章主要介紹了SpringCloud中的Eureka注冊中心詳細解讀,想要參與服務注冊發(fā)現(xiàn)的實例首先需要向Eureka服務器注冊信息,注冊在第一次心跳發(fā)生時提交,需要的朋友可以參考下
    2023-11-11
  • Java中Spring Boot支付寶掃碼支付及支付回調的實現(xiàn)代碼

    Java中Spring Boot支付寶掃碼支付及支付回調的實現(xiàn)代碼

    這篇文章主要介紹了Java中Spring Boot支付寶掃碼支付及支付回調的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java實現(xiàn)超級實用的日記本

    Java實現(xiàn)超級實用的日記本

    一個用Java語言編寫的,實現(xiàn)日記本的基本編輯功能、各篇日記之間的上下翻頁、查詢日記內容的程序。全部代碼分享給大家,有需要的小伙伴參考下。
    2015-05-05
  • java處理字節(jié)的常用工具類

    java處理字節(jié)的常用工具類

    這篇文章主要為大家詳細介紹了java處理字節(jié)的常用工具類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • drools規(guī)則動態(tài)化實踐解析

    drools規(guī)則動態(tài)化實踐解析

    這篇文章主要為大家介紹了drools規(guī)則動態(tài)化實踐解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02

最新評論

大宁县| 吐鲁番市| 乌苏市| 崇礼县| 宾川县| 新丰县| 蒙自县| 伊通| 平凉市| 永吉县| 徐州市| 武陟县| 山阳县| 墨竹工卡县| 兰坪| 堆龙德庆县| 南康市| 搜索| 延长县| 台中县| 岳普湖县| 江永县| 保定市| 保定市| 全椒县| 凤凰县| 游戏| 辽宁省| 大姚县| 洪江市| 壤塘县| 襄樊市| 都匀市| 彝良县| 保山市| 慈溪市| 莱芜市| 衡山县| 建始县| 神农架林区| 武汉市|