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

Java class文件格式之?dāng)?shù)據(jù)類型_動力節(jié)點Java學(xué)院整理

 更新時間:2017年06月14日 15:10:31   投稿:mrr  
這篇文章主要介紹了Java class文件格式之?dāng)?shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下

CONSTANT_Integer_info

一個常量池中的CONSTANT_Integer_info數(shù)據(jù)項, 可以看做是CONSTANT_Integer類型的一個實例。 它存儲的是源文件中出現(xiàn)的int型數(shù)據(jù)的值。 同樣, 作為常量池中的一種數(shù)據(jù)類型, 它的第一個字節(jié)也是一個tag值, 它的tag值為3, 也就是說, 當(dāng)虛擬機(jī)讀到一個tag值為3的數(shù)據(jù)項時, 就知道這個數(shù)據(jù)項是一個CONSTANT_Integer_info, 它存儲的是int型數(shù)值的值。 緊挨著tag的下面4個字節(jié)叫做bytes, 就是int型數(shù)值的整型值。 它的內(nèi)存布局如下:

下面以示例代碼進(jìn)行說明, 示例代碼如下:

package com.bjpowernode.test; 
public class TestInt { 
 void printInt(){ 
  System.out.println(65535); 
 } 
} 

將上面的類生成的class文件反編譯:

1.D:\Workspace\AndroidWorkspace\BlogTest\bin>javap -v -c -classpath . com.bjpowernode.test.TestInt  

下面列出反編譯的結(jié)果, 由于反編譯結(jié)果較長, 我們省略了大部分信息:

.................. 
 .................. 
Constant pool: 
 .................. 
 .................. 
 #21 = Integer   65535 
 .................. 
 .................. 
{ 
  .................. 
  .................. 
 void printInt(); 
 flags: 
 Code: 
  stack=2, locals=1, args_size=1 
   0: getstatic  #15     // Field java/lang/System.out:Ljava/io/PrintStream; 
   3: ldc   #21     // int 65535 
   5: invokevirtual #22     // Method java/io/PrintStream.println:(I)V 
   8: return 
  LineNumberTable: 
  line 6: 0 
  line 7: 8 
  LocalVariableTable: 
  Start Length Slot Name Signature 
    0  9  0 this Lcom/bjpowernode/test/TestInt; 
} 

上面的輸出結(jié)果中, 保留了printInt方法的反編譯結(jié)果, 并且保留了常量池中的第21項。 首先看printInt方法反編譯結(jié)果中的索引為3 的字節(jié)碼指令:

1.3: ldc           #21                 // int 65535  

這條ldc指令, 引用了常量池中的第21項, 而第21項是一個CONSTANT_Integer_info, 并且這個CONSTANT_Integer_info存儲的整型值為65535 。 

CONSTANT_Float_info

一個常量池中的CONSTANT_Float_info數(shù)據(jù)項, 可以看做是CONSTANT_Float類型的一個實例。 它存儲的是源文件中出現(xiàn)的float型數(shù)據(jù)的值。 同樣, 作為常量池中的一種數(shù)據(jù)類型, 它的第一個字節(jié)也是一個tag值, 它的tag值為4, 也就是說, 當(dāng)虛擬機(jī)讀到一個tag值為4的數(shù)據(jù)項時, 就知道這個數(shù)據(jù)項是一個CONSTANT_Float_info, 并且知道它存儲的是float型數(shù)值。 緊挨著tag的下面4個字節(jié)叫做bytes, 就是float型的數(shù)值。 它的內(nèi)存布局如下:

舉例說明, 如果源文件中的一句代碼使用了一個float值, 如下所示:

void printFloat(){ 
 System.out.println(1234.5f); 
} 

那么在這個類的常量池中就會有一個CONSTANT_Float_info與之相對應(yīng), 這個CONSTANT_Float_info的形式如下:

代碼反編譯結(jié)果如下:

Constant pool: 
............ 
............ 
 #29 = Float    1234.5f 
........... 
........... 
{ 
............ 
............ 
 void printFloat(); 
 flags: 
 Code: 
  stack=2, locals=1, args_size=1 
   0: getstatic  #15     // Field java/lang/System.out:Ljava/io/PrintStream; 
   3: ldc   #29     // float 1234.5f 
   5: invokevirtual #30     // Method java/io/PrintStream.println:(F)V 
   8: return 
  LineNumberTable: 
  line 10: 0 
  line 11: 8 
  LocalVariableTable: 
  Start Length Slot Name Signature 
    0  9  0 this Lcom/bjpowernode/test/TestInt; 
} 

CONSTANT_Long_info

一個常量池中的CONSTANT_Long_info數(shù)據(jù)項, 可以看做是CONSTANT_Long類型的一個實例。 它存儲的是源文件中出現(xiàn)的long型數(shù)據(jù)的值。 同樣, 作為常量池中的一種數(shù)據(jù)類型, 它的第一個字節(jié)也是一個tag值, 它的tag值為5, 也就是說, 當(dāng)虛擬機(jī)讀到一個tag值為5的數(shù)據(jù)項時, 就知道這個數(shù)據(jù)項是一個CONSTANT_Long_info, 并且知道它存儲的是long型數(shù)值。 緊挨著tag的下面8個字節(jié)叫做bytes, 就是long型的數(shù)值。 它的內(nèi)存布局如下:

舉例說明, 如果源文件中的一句代碼使用了一個long型的數(shù)值, 如下所示:

void printLong(){ 
 System.out.println(123456L); 
} 

那么在這個類的常量池中就會有一個CONSTANT_Long_info與之相對應(yīng), 這個CONSTANT_Long_info的形式如下:

代碼反編譯結(jié)果為:

Constant pool: 
............. 
............. 
 #21 = Long    123456l 
............. 
............. 
{ 
.............. 
.............. 
 void printLong(); 
 flags: 
 Code: 
  stack=3, locals=1, args_size=1 
   0: getstatic  #15     // Field java/lang/System.out:Ljava/io/PrintStream; 
   3: ldc2_w  #21     // long 123456l 
   6: invokevirtual #23     // Method java/io/PrintStream.println:(J)V 
   9: return 
  LineNumberTable: 
  line 7: 0 
  line 8: 9 
  LocalVariableTable: 
  Start Length Slot Name Signature 
    0  10  0 this Lcom/bjpowernode/test/TestInt; 
} 

CONSTANT_Double_info

一個常量池中的CONSTANT_Double_info數(shù)據(jù)項, 可以看做是CONSTANT_Double類型的一個實例。 它存儲的是源文件中出現(xiàn)的double型數(shù)據(jù)的值。 同樣, 作為常量池中的一種數(shù)據(jù)類型, 它的第一個字節(jié)也是一個tag值, 它的tag值為6, 也就是說, 當(dāng)虛擬機(jī)讀到一個tag值為6的數(shù)據(jù)項時, 就知道這個數(shù)據(jù)項是一個CONSTANT_Double_info, 并且知道它存儲的是double型數(shù)值。 緊挨著tag的下面8個字節(jié)叫做bytes, 就是double型的數(shù)值。 它的內(nèi)存布局如下:


舉例說明, 如果源文件中的一句代碼使用了一個double型的數(shù)值, 如下所示:

void printDouble(){ 
 System.out.println(123456D); 
} 

那么在這個類的常量池中就會有一個CONSTANT_Double_info與之相對應(yīng), 這個CONSTANT_Double_info的形式如下:

代碼反編譯結(jié)果為:

Constant pool: 
............ 
............ 
 #21 = Double    123456.0d 
............ 
............ 
{ 
............. 
............. 
 void printDouble(); 
 flags: 
 Code: 
  stack=3, locals=1, args_size=1 
   0: getstatic  #15     // Field java/lang/System.out:Ljava/io/PrintStream; 
   3: ldc2_w  #21     // double 123456.0d 
   6: invokevirtual #23     // Method java/io/PrintStream.println:(D)V 
   9: return 
  LineNumberTable: 
  line 7: 0 
  line 8: 9 
  LocalVariableTable: 
  Start Length Slot Name Signature 
    0  10  0 this Lcom/bjpowernode/test/TestInt; 
} 

CONSTANT_String_info

在常量池中, 一個CONSTANT_String_info數(shù)據(jù)項, 是CONSTANT_String類型的一個實例。 它的作用是存儲文字字符串, 可以把他看做是一個存在于class文件中的字符串對象。 同樣, 它的第一個字節(jié)是tag值, 值為8 , 也就是說, 虛擬機(jī)訪問一個數(shù)據(jù)項時, 判斷tag值為8 , 就說明訪問的數(shù)據(jù)項是一個CONSTANT_String_info 。 緊挨著tag的后兩個字節(jié)是一個叫做string_index的常量池引用, 它指向一個CONSTANT_Utf8_info, 這個CONSTANT_Utf8_info存放的才是字符串的字面量。 它的內(nèi)存布局如下:

 

舉例說明, 如果源文件中的一句代碼使用了一個字符串常量, 如下所示:

void printStrng(){ 
 System.out.println("abcdef"); 
} 

那么在這個類的常量池中就會有一個CONSTANT_String_info與之相對應(yīng), 反編譯結(jié)果如下:

Constant pool: 
............ 
............ 
 #21 = String    #22   // abcdef 
 #22 = Utf8    abcdef 
............ 
............. 
{ 
............. 
............. 
 void printStrng(); 
 flags: 
 Code: 
  stack=2, locals=1, args_size=1 
   0: getstatic  #15     // Field java/lang/System.out:Ljava/io/PrintStream; 
   3: ldc   #21     // String abcdef 
   5: invokevirtual #23     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
   8: return 
  LineNumberTable: 
  line 7: 0 
  line 8: 8 
  LocalVariableTable: 
  Start Length Slot Name Signature 
    0  9  0 this Lcom/bjpowernode/test/TestInt; 
} 

其中printString方法中索引為3的字節(jié)碼指令ldc引用常量池中的第21項, 第21項是一個CONSTANT_String_info, 這個位于第21項的CONSTANT_String_info又引用了常量池的第22項, 第22項是一個CONSTANT_Utf8_info, 這個CONSTANT_Utf8_info中存儲的字符串是 abcdef 。 引用關(guān)系的內(nèi)存布局如下:

 

總結(jié)

最后總結(jié)一下, 本文主要講解了常量池中的五中數(shù)據(jù)項, 分別為CONSTANT_Integer_info, CONSTANT_Float_info, CONSTANT_Long_info, CONSTANT_Double_info 和CONSTANT_String_info 。 這幾種常量池數(shù)據(jù)項都是直接存儲的常量值,而不是符號引用。 這里又一次出現(xiàn)了符號引用的概念, 這個概念將會在下一篇博客中詳細(xì)講解, 因為下一篇博客要介紹的剩下的四種常量池數(shù)據(jù)項, 都是符號引用, 這四種表示符號引用的數(shù)據(jù)項又會直接或間接引用上篇文章中介紹的CONSTANT_NameAndType_info和CONSTANT_Utf8_info, 所以說CONSTANT_NameAndType_info是符號引用的一部分。

從本文中我們還可以知道。 雖然說CONSTANT_String_info是直接存儲值的數(shù)據(jù)項, 但是CONSTANT_String_info有點特別, 因為它不是直接存儲字符串, 而是引用了一個CONSTANT_Utf8_info, 這個被引用的CONSTANT_Utf8_info中存儲了字符串。

相關(guān)文章

  • springboot如何根據(jù)不同的日志級別顯示不同的顏色

    springboot如何根據(jù)不同的日志級別顯示不同的顏色

    這篇文章主要介紹了springboot如何根據(jù)不同的日志級別顯示不同的顏色問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java連接MySQL數(shù)據(jù)庫實現(xiàn)代碼

    java連接MySQL數(shù)據(jù)庫實現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java連接MySQL數(shù)據(jù)庫實現(xiàn)代碼,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java IO流 文件的編碼實例代碼

    Java IO流 文件的編碼實例代碼

    本文通過實例代碼給大家介紹了java io流文件編碼的方法,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-05-05
  • SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)

    SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)

    本文主要介紹了SpringBoot中MyBatis使用自定義TypeHandler,當(dāng)默認(rèn)的類型映射不能滿足需求時,自定義?TypeHandler?就非常有用,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08
  • eclipse實現(xiàn)ElGamal數(shù)字簽名

    eclipse實現(xiàn)ElGamal數(shù)字簽名

    這篇文章主要為大家詳細(xì)介紹了eclipse實現(xiàn)ElGamal數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • Java遞歸 遍歷目錄的小例子

    Java遞歸 遍歷目錄的小例子

    Java遞歸 遍歷目錄的小例子,需要的朋友可以參考一下
    2013-03-03
  • Spring Boot使用Druid連接池的示例代碼

    Spring Boot使用Druid連接池的示例代碼

    Druid是Java語言中最好的數(shù)據(jù)庫連接池。這篇文章主要介紹了Spring Boot使用Druid連接池的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • java中數(shù)組的定義及使用方法(推薦)

    java中數(shù)組的定義及使用方法(推薦)

    下面小編就為大家?guī)硪黄猨ava中數(shù)組的定義及使用方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-07-07
  • spring boot 監(jiān)控處理方案實例詳解

    spring boot 監(jiān)控處理方案實例詳解

    這篇文章主要介紹了spring boot 監(jiān)控處理方案的相關(guān)資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • JsonFormat與@DateTimeFormat注解實例解析

    JsonFormat與@DateTimeFormat注解實例解析

    這篇文章主要介紹了JsonFormat與@DateTimeFormat注解實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-12-12

最新評論

锡林浩特市| 乾安县| 二连浩特市| 宁阳县| 宁城县| 宝丰县| 台南市| 陵川县| 威海市| 施甸县| 象州县| 济阳县| 隆林| 盐亭县| 禹城市| 阿拉善盟| 阿合奇县| 澄迈县| 福建省| 乐山市| 中山市| 灯塔市| 静乐县| 张家界市| 南通市| 塔河县| 灵璧县| 湘阴县| 新津县| 吉林省| 沙河市| 乌审旗| 古浪县| 弥勒县| 固安县| 三明市| 江口县| 祁门县| 炎陵县| 平山县| 屯昌县|