亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java class文件格式之方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

class文件中的fields_count和fields

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

位于fields_count下面的數(shù)據(jù)叫做fields, 可以把它看做一個(gè)數(shù)組, 數(shù)組中的每一項(xiàng)是一個(gè)field_info 。這個(gè)數(shù)組中一共有fields_count個(gè)field_info , 每個(gè)field_info都是對(duì)一個(gè)字段的描述。 下面我們?cè)敿?xì)講解field_info的結(jié)構(gòu)。 每個(gè)field_info的結(jié)構(gòu)如下:

(1)access_flags

其中access_flags占兩個(gè)字節(jié), 描述的是字段的訪問(wèn)標(biāo)志信息。 這里就不在詳細(xì)介紹了, 下面給出一張表格(該表格來(lái)自《深入Java虛擬機(jī)》):

(2)name_index

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

(3)descriptor_index

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

(4)attributes_count和attributes

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

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

下面我們以代碼的形式進(jìn)行解釋?zhuān)创a如下:

package com.bjpowernode.test; 

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

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

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

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

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

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

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

 根據(jù)反編譯的結(jié)果,可以下面給出示意圖, 該圖說(shuō)明了與computer相對(duì)應(yīng)的field_info是不合引用常量池的 ( 其中虛線(xiàn)范圍內(nèi)表示常量池):

class文件中的methods_count和methods

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

位于methods_count下面的數(shù)據(jù)叫做methods,可以把它看做一個(gè)數(shù)組, 數(shù)組中的每一項(xiàng)是一個(gè)method_info。這個(gè)數(shù)組中一共有methods_count個(gè)method_info,每個(gè)method_info 都是對(duì)一個(gè)方法的描述。 下面我們?cè)敿?xì)講解method_info的結(jié)構(gòu)。每個(gè)method_info 的結(jié)構(gòu)如下,幾乎和field_info的結(jié)構(gòu)是一樣的:

(1)access_flags

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

(2)name_index

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

(3)descriptor_index

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

(4)attributes_count和attributes

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

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

介紹完了每個(gè)method_info的結(jié)構(gòu), 下面我們以代碼來(lái)說(shuō)明, 還是使用上面的源碼:

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

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

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 
 
......... 
} 

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

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

總結(jié)

到此為止, 我們就介紹完了class文件中的fields和methods, 進(jìn)行一下總結(jié)。 
 fields是對(duì)當(dāng)前類(lèi)中定義的字段的描述, 其中每個(gè)字段使用一個(gè)field_info表示, fields中有fields_count個(gè)field_info。
methods是對(duì)當(dāng)前類(lèi)或者接口中聲明的方法的描述, 其中每個(gè)方法使用一個(gè)method_info表示, methods中有methods_count個(gè)method_info。 

在下一篇博客中,將會(huì)介紹class文件中的各個(gè)屬性,敬請(qǐng)關(guān)注。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot 攔截器妙用你真的了解嗎

    SpringBoot 攔截器妙用你真的了解嗎

    關(guān)于springboot攔截器很多朋友掌握的不是多好,今天抽空給大家普及下這方面的知識(shí),SpringBoot 攔截器妙用,讓你一個(gè)人開(kāi)發(fā)整個(gè)系統(tǒng)的鑒權(quán)模塊,快來(lái)跟小編一起學(xué)習(xí)下吧
    2021-07-07
  • Java過(guò)濾器與監(jiān)聽(tīng)器間區(qū)別與聯(lián)系

    Java過(guò)濾器與監(jiān)聽(tīng)器間區(qū)別與聯(lián)系

    監(jiān)聽(tīng)器是一個(gè)接口內(nèi)容由我們實(shí)現(xiàn),會(huì)在特定時(shí)間被調(diào)用,監(jiān)聽(tīng)器用于監(jiān)聽(tīng)web應(yīng)用中三大域?qū)ο?request,session,application),信息的創(chuàng)建,銷(xiāo)毀,增加,修改,刪除等動(dòng)作的發(fā)生,然后做出相應(yīng)的響應(yīng)處理
    2023-01-01
  • SpringBoot中的RabbitMQ用法詳解

    SpringBoot中的RabbitMQ用法詳解

    RabbitMQ是一個(gè)開(kāi)源的消息隊(duì)列系統(tǒng),它通過(guò)AMQP(高級(jí)消息隊(duì)列協(xié)議)來(lái)實(shí)現(xiàn)消息的傳遞,SpringBoot是目前非常流行的Java開(kāi)發(fā)框架,它提供了很多便利性的功能,其中就包括對(duì)RabbitMQ的支持,在本文中,我們將介紹如何在SpringBoot中使用RabbitMQ
    2023-07-07
  • java中set集合的常用方法詳解

    java中set集合的常用方法詳解

    本篇文章給大家?guī)?lái)的內(nèi)容是關(guān)于java中set集合的常用方法詳解,有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。下面我們就來(lái)學(xué)習(xí)一下吧
    2021-11-11
  • Java全面詳細(xì)講解邏輯控制的使用

    Java全面詳細(xì)講解邏輯控制的使用

    在程序開(kāi)發(fā)的過(guò)程之中一共會(huì)存在三種程序邏輯:順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu),對(duì)于之前所編寫(xiě)的代碼大部分都是順序結(jié)構(gòu)的定義,即:所有的程序?qū)凑斩x的代碼順序依次執(zhí)行,讓我們來(lái)深入探討一下
    2022-04-04
  • htmlcleaner使用方法及xpath語(yǔ)法初探

    htmlcleaner使用方法及xpath語(yǔ)法初探

    HtmlCleaner是一個(gè)開(kāi)源的Java語(yǔ)言的Html文檔解析器。HtmlCleaner能夠重新整理HTML文檔的每個(gè)元素并生成結(jié)構(gòu)良好(Well-Formed)的 HTML 文檔
    2015-08-08
  • 國(guó)內(nèi)分布式框架Dubbo使用詳解

    國(guó)內(nèi)分布式框架Dubbo使用詳解

    這篇文章主要為大家介紹了國(guó)內(nèi)分布式框架Dubbo使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸

    使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸

    這篇文章主要為大家詳細(xì)介紹了使用Feign實(shí)現(xiàn)微服務(wù)間文件傳輸,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java編寫(xiě)網(wǎng)上超市購(gòu)物結(jié)算功能程序

    Java編寫(xiě)網(wǎng)上超市購(gòu)物結(jié)算功能程序

    這篇文章主要為大家詳細(xì)介紹了Java編寫(xiě)網(wǎng)上超市購(gòu)物結(jié)算功能程序的具體代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-06-06
  • 詳解Java異常處理最佳實(shí)踐及陷阱防范

    詳解Java異常處理最佳實(shí)踐及陷阱防范

    這篇文章主要介紹了Java異常處理最佳實(shí)踐及陷阱防范,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論