激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Java class文件格式之方法_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

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

2020-11-17 11:05zhangjg Java教程

這篇文章主要為大家詳細(xì)介紹了Java class文件格式之方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

class文件中的fields_count和fields

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

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

(1)access_flags

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

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

(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è)概念, 在源文件測層面中, 屬性是字段的另一種叫法, 希望讀者不要疑惑。讀者也不要輕視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è)屬性。可以出現(xiàn)在filed_info中的屬性有三種, 分別是constantvalue, deprecated, 和 synthetic。 這些屬性會(huì)在后面的文章中進(jìn)行介紹。

下面我們以代碼的形式進(jìn)行解釋, 源碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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ì)有如下信息(這里省略了大部分無關(guān)信息):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
constant pool:
 
.........
.........
 
 #5 = utf8    computer
 #6 = utf8    lcom/jg/zhang/computer;
 
.........
.........
 
{
 
 private com.jg.zhang.computer computer;
 flags: acc_private
 
.........
.........
 
}

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

?
1
2
private com.bjpowernode.test.computer computer;
flags: acc_private

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

?
1
2
javap -c -v -private -
classpath . com.bjpowernode.test.programer

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

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

class文件中的methods_count和methods

fields下面的信息是methods_count和methods 。 methods_count描述的是當(dāng)前的類中定義的方法的個(gè)數(shù), 注意, 這里包括靜態(tài)方法, 但不包括從父類繼承的方法。 如果當(dāng)前class文件是由一個(gè)接口生成的, 那么這里的methods_count描述的是接口中定義的抽象方法的數(shù)量, 我們知道, 接口中定義的方法默認(rèn)都是公有的。此外需要說明的是, 編譯器可能會(huì)在編譯時(shí)向class文件增加額外的方法, 也就是說, class文件中的方法的數(shù)量可能多于源文件中由用戶定義的方法。 舉例來說: 如果當(dāng)前類沒有定義構(gòu)造方法, 那么編譯器會(huì)增加一個(gè)無參數(shù)的構(gòu)造函數(shù)<init>; 如果當(dāng)前類或接口中定義了靜態(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)是一樣的:

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

(1)access_flags

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

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

(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è)概念, 在源文件測層面中, 屬性是字段的另一種叫法, 希望讀者不要疑惑。讀者也不要輕視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è)屬性。可以出現(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), 下面我們以代碼來說明, 還是使用上面的源碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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ì)有如下信息(這里省略了大部分無關(guān)信息):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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é)果可以看出, 該類中定義了兩個(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ù)常量池中的信息, 可以得出如下的示意圖, 該示意圖形象的說明了class文件中的method_info是如何引用常量池中的數(shù)據(jù)項(xiàng)來描述當(dāng)前類中定義的方法的。 圖中虛線范圍內(nèi)表示常量池所在的區(qū)域:

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

總結(jié)

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

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

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国av在线 | 男女亲热网站 | 久久蜜臀一区二区三区av | 欧美巨根 | 久久777国产线看观看精品 | 色99999| 欧美一区成人 | 91高清在线 | 91情侣在线偷精品国产 | 久久99精品久久久久久园产越南 | 精品成人av一区二区三区 | 在线a亚洲视频播放在线观看 | 欧美在线成人影院 | 国产精品高潮99久久久久久久 | 羞羞的视频免费在线观看 | 精品国产乱码久久久久久预案 | 国产精品久久久久久久久久尿 | 成人在线视频一区 | 久久久久成人免费 | 羞羞的动漫在线观看 | 亚洲福利视 | 高清中文字幕在线 | videos真实高潮xxxx | 欧美成人精品欧美一级 | 日本欧美一区二区三区在线播 | 99r国产精品 | 日本不卡二区 | 国产毛片在线高清视频 | 日韩黄色免费电影 | 中文区永久区 | www.成人精品 | 国产午夜亚洲精品 | 韩国十九禁高潮床戏在线观看 | 免费看成人毛片 | 夜班护士在线观看 | 午夜男人免费视频 | 在线观看中文字幕av | 国产韩国精品一区二区三区久久 | 福利在线小视频 | 一级电影免费 | 午夜视频在线免费 |