成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Class文件結(jié)構(gòu)3之字段表與方法表

開(kāi)發(fā) 前端
本篇給大家介紹Class文件結(jié)構(gòu)之字段表與方法表的相關(guān)知識(shí),希望對(duì)你有所幫助。

[[373393]]

 1、字段表

字段表緊隨在接口表索引之后,字段表包含訪(fǎng)問(wèn)標(biāo)記、字段名索引、描述符索引、屬性表,其中屬性表包含屬性計(jì)數(shù)器與屬性集合

以這段代碼為例:

  1. package com.yang.testField; 
  2.  
  3. public class Main { 
  4.     private volatile int a = 1; 
  5.     public static final String b = "abc"
  6.  

 16進(jìn)制數(shù)據(jù)如下圖所示:


可以看得出,字段計(jì)數(shù)為0x0002,因?yàn)橛?個(gè)字段,a和b。

字段a的訪(fǎng)問(wèn)標(biāo)記是是0x0042,用這個(gè)值與標(biāo)識(shí)符的特征值取與,如果結(jié)果為1,則表示該字段擁有相應(yīng)的標(biāo)識(shí)符。字段標(biāo)識(shí)符如下所示:


這里我們可以得出,a的訪(fǎng)問(wèn)標(biāo)記有ACC_PRIVATE與ACC_VOLATILE。

a的名稱(chēng)索引為0x0005,我們看一下常量池:


可以得出第一個(gè)字段的名稱(chēng)索引指向常量池中第5個(gè)常量項(xiàng),即“a”。

a的描述符索引為0x0006,即常量池中的“I”,完成的字段類(lèi)型與描述符的對(duì)照表如下:

class文件結(jié)構(gòu)3——字段表與方法表

接下來(lái)是a的屬性計(jì)數(shù)器,對(duì)應(yīng)的值為0x0000,代表a沒(méi)有屬性表。

貼一下b字段表中的屬性表:


b的屬性計(jì)數(shù)器為0x0001,代表著有屬性表,屬性表中只有一個(gè)元素,為0x0009,常量池中顯示為ConstantValue,說(shuō)明

該屬性是ConstantValue類(lèi)型的,屬性長(zhǎng)度為2,屬性值索引為0x000A,即找到常量池中的#11,再找到#21,原來(lái)是個(gè)字符串"abc"。

為什么int a沒(méi)有屬性表,而static final b卻有屬性表?這要從字段的賦值策略說(shuō)起:

對(duì)于一個(gè)實(shí)例字段,比如這里的a,賦值階段發(fā)生在對(duì)象實(shí)例的構(gòu)造方法中,即;

對(duì)于一個(gè)非final的靜態(tài)字段,賦初始值會(huì)發(fā)生在解析階段,而賦用戶(hù)指定的值,會(huì)發(fā)生在初始化階段,在類(lèi)構(gòu)造器方法中完成,即。

對(duì)于一個(gè)final的靜態(tài)字段,且是基本類(lèi)型或者是String類(lèi)型,在編譯期間就給該變量賦予用戶(hù)指定的值,并在常量池中形成一個(gè)ConstantValue類(lèi)型的屬性,屬性值就是常量的值。如果是除去String類(lèi)型以外的引用類(lèi)型,那么就是在初始化階段完成賦值操作。

下面以一個(gè)例子說(shuō)明:

  1. package com.yang.testField; 
  2.  
  3. public class Main { 
  4.     private volatile int a = 1; 
  5.     public static final String b = "abc"
  6.     public static String c="def"
  7.     public static Thread d=new Thread(); 
  8.  

 方法內(nèi)的情況: 

class文件結(jié)構(gòu)3——字段表與方法表

這里面完成的是對(duì)實(shí)例變量的賦值操作。

方法內(nèi)的情況:


這里面完成的是對(duì)普通靜態(tài)變量c與非String的引用類(lèi)型變量d的賦值操作。

更多關(guān)于對(duì)方法的理解,可以參考這篇文章java執(zhí)行順序之深入理解clinit和init

2、方法表

緊接著字段表的是方法表,方法表和字段表類(lèi)似,方法表包含方法計(jì)數(shù)、訪(fǎng)問(wèn)標(biāo)記、名稱(chēng)索引、描述符索引、屬性表,其中屬性表也是包含屬性計(jì)數(shù)與屬性集合。

方法計(jì)數(shù)、名稱(chēng)索引這邊就不再說(shuō)明了。

方法的訪(fǎng)問(wèn)標(biāo)記有:

class文件結(jié)構(gòu)3——字段表與方法表

這里有一個(gè)簡(jiǎn)單的例子:

  1. package com.yang.testMethod; 
  2.  
  3. public class Main { 
  4.     public Main() { 
  5.     } 
  6.  
  7.     private int getInt(int k) { 
  8.         return k; 
  9.     } 
  10.  
  11.     public static Thread getThread(int i, double d, Runnable runnable) { 
  12.         System.out.println(i * d); 
  13.         return new Thread(runnable); 
  14.     } 
  15.  

 構(gòu)造方法的描述符為()V

getInt方法的描述符為(I)I

getThread方法的描述符為(IDLjava/lang/Runnable;)Ljava/lang/Thread;

從這里,我們可以看得出,方法描述符的組織方式是這樣子的:(參數(shù)列表內(nèi)字段的描述符)返回值的描述符

接下來(lái)討論方法的屬性表,前面說(shuō)過(guò)了,屬性表包含屬性計(jì)數(shù)與屬性集合,屬性集合又包含屬性名稱(chēng)索引+屬性長(zhǎng)度+屬性值。

屬性表內(nèi)最主要的屬性就是Code屬性了,Code屬性?xún)?nèi)有幾個(gè)比較重要的東西:字節(jié)碼、LineNumberTable行號(hào)表、LocalVariableTable局部變量表、ExceptionTable異常表

用一下的代碼為例:

  1. public static Thread getThread(int i, double d, Runnable runnable) { 
  2.     try { 
  3.         System.out.println(i * d); 
  4.     }catch (Exception e){ 
  5.         return null
  6.     } 
  7.     return new Thread(runnable); 

 字節(jié)碼是class文件中最重要的東西了,jvm主要就是抽取字節(jié)碼,然后去執(zhí)行。

class文件結(jié)構(gòu)3——字段表與方法表

LineNumberTable內(nèi)維護(hù)著java源碼與字節(jié)碼之間的對(duì)應(yīng)關(guān)系:

class文件結(jié)構(gòu)3——字段表與方法表

LocalVariableTable內(nèi)記錄著局部變量描述:


關(guān)于局部變量表的詳細(xì)內(nèi)容,可以參考我的另外一篇文章虛擬機(jī)棧的五臟六腑 。

ExceptionTable會(huì)告訴虛擬機(jī)異常的處理邏輯,比如下圖的異常表,說(shuō)明如果字節(jié)碼從第0行到第10行出現(xiàn)了type類(lèi)型的異常,那么將會(huì)跳轉(zhuǎn)到第13行的字節(jié)碼進(jìn)行處理。

class文件結(jié)構(gòu)3——字段表與方法表

 

責(zé)任編輯:姜華 來(lái)源: 今日頭條
相關(guān)推薦

2010-10-13 10:03:08

MySQL修改表結(jié)構(gòu)

2010-10-19 16:20:32

SQL SERVER表

2021-06-30 09:40:31

MySQL數(shù)據(jù)庫(kù)Java

2009-08-11 14:30:32

C#數(shù)據(jù)結(jié)構(gòu)與算法

2010-09-28 10:53:53

SQL表結(jié)構(gòu)

2010-11-23 09:13:47

mysql修改表結(jié)構(gòu)

2009-08-11 14:14:42

C#數(shù)據(jù)結(jié)構(gòu)與算法

2021-07-11 12:06:43

python數(shù)據(jù)結(jié)構(gòu)

2018-06-06 08:54:23

數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)

2023-02-08 07:52:36

跳躍表數(shù)據(jù)結(jié)構(gòu)

2010-05-21 10:14:10

MySQL更改表結(jié)構(gòu)

2023-11-06 06:43:23

單鏈表查詢(xún)數(shù)據(jù)結(jié)構(gòu)

2017-08-31 09:45:43

JavaArrayList數(shù)據(jù)

2009-08-12 18:35:17

C#數(shù)據(jù)結(jié)構(gòu)

2010-11-25 16:40:11

MySQL大表重復(fù)字段

2010-08-26 16:49:09

DB2導(dǎo)入導(dǎo)出

2021-01-06 10:36:55

MySQL數(shù)據(jù)庫(kù)Hive

2010-09-16 16:29:15

sql server表

2010-03-16 14:15:37

Linux系統(tǒng)

2013-04-23 10:58:28

HBase
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩中文字幕在线观看视频 | 欧美国产视频 | 成人在线观看免费观看 | 美女一级毛片 | 一级在线观看 | 欧美一级二级三级视频 | 成人性生交a做片 | 天堂中文字幕av | 国产一区二区成人 | 久久综合一区 | 亚洲精品久久久久中文字幕欢迎你 | 日本精品免费在线观看 | 国产精品视频久久久久久 | 欧美日韩在线一区二区 | 久久精品视频网站 | 免费精品 | 婷婷亚洲综合 | 日韩激情在线 | 欧美韩一区二区三区 | 欧美成人一级 | 日本成人免费网站 | 亚洲在线视频 | 超碰3| 日韩欧美在线观看 | 又黑又粗又长的欧美一区 | 一区二区日韩 | 色综合久久久久 | 欧美一区二区视频 | 成人深夜福利在线观看 | 精品亚洲一区二区三区 | 香蕉国产在线视频 | 四虎影音 | 久久久久久亚洲精品 | 成人免费视频网站在线看 | 欧美黄色大片在线观看 | 久久久久久999 | 拍真实国产伦偷精品 | 国产成人一区二区三区 | av网站免费看 | 精品九九在线 | 亚洲精品视频播放 |