日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 )

發布時間:2025/6/17 21 豆豆

文章目錄

  • 前言
  • 一、常量池結構分析
    • 1、常量池位置
    • 2、常量池結構
    • 3、常量池單個常量
    • 4、常量池單個常量 tag 標簽
  • 二、常量池字節碼文件分析
    • 0、常量池附加信息
    • 1、常量池 #1 常量分析
    • 2、常量池 #2 常量分析
    • 3、常量池 #3 常量分析
    • 4、常量池 #4 常量分析
    • 5、常量池 #5 常量分析
    • 6、常量池 #6 常量分析
    • 7、常量池 #7 常量分析
    • 8、常量池 #8 常量分析
    • 9、常量池 #9 常量分析
    • 10、常量池 #10 常量分析
    • 11、常量池 #11 常量分析
    • 12、常量池 #12 常量分析
    • 13、常量池 #13 常量分析
    • 14、常量池 #14 常量分析
    • 15、常量池 #15 常量分析
    • 16、常量池 #16 常量分析
    • 17、常量池 #17 常量分析
    • 18、常量池 #18 常量分析
    • 19、常量池 #19 常量分析
    • 20、常量池 #20 常量分析
  • 總結

前言

接上一篇博客 【Java 虛擬機原理】Class 字節碼二進制文件分析 一 ( 字節碼文件附加信息 | 魔數 | 次版本號 | 主版本號 | 常量池個數 ) ;





一、常量池結構分析




1、常量池位置


下圖的紅框內是常量池 , 在 " 常量池計數器 " 后面的若干字節 ;

101010 字節及之后的若干字節是常量池范圍 ;

不同的字節碼文件 , 常量池的范圍是不同的 ;


2、常量池結構


常量池的結構如下 :


3、常量池單個常量


常量池中的單個常量 : 每個常量 都是如下 cp_info 格式的數據 ;


4、常量池單個常量 tag 標簽


常量池的 tag 以及代表的含義 :





二、常量池字節碼文件分析




0、常量池附加信息


完整的常量池 字節碼附加信息 :

Constant pool:#1 = Methodref #4.#17 // java/lang/Object."<init>":()V#2 = Fieldref #3.#18 // Student.name:Ljava/lang/String;#3 = Class #19 // Student#4 = Class #20 // java/lang/Object#5 = Utf8 name#6 = Utf8 Ljava/lang/String;#7 = Utf8 <init>#8 = Utf8 ()V#9 = Utf8 Code#10 = Utf8 LineNumberTable#11 = Utf8 getName#12 = Utf8 ()Ljava/lang/String;#13 = Utf8 setName#14 = Utf8 (Ljava/lang/String;)V#15 = Utf8 SourceFile#16 = Utf8 Student.java#17 = NameAndType #7:#8 // "<init>":()V#18 = NameAndType #5:#6 // name:Ljava/lang/String;#19 = Utf8 Student#20 = Utf8 java/lang/Object

1、常量池 #1 常量分析


#1 常量分析 : tag 值為 0A ; tag 值為 10 的時候 , 說明該常量是方法引用 ;

#1 = Methodref #4.#17 // java/lang/Object."<init>":()V

常量 tag : 0A ;

常量 info[] : 00 04 00 11 , 444 個字節 , 前 222 個字節代表類信息 , 后 222 字節代表方法和類型 ;

  • 00 04 類信息 ; 指向常量表中的 #4 常量 ; 類型是 java/lang/Object ;
  • 00 11 方法類型 ; 指向常量表中的 #17 常量 ; 類型是 "<init>":()V ;


2、常量池 #2 常量分析


#1 常量分析 : tag 值為 09 ; tag 值為 10 的時候 , 說明該常量是字段引用 ;

#2 = Fieldref #3.#18 // Student.name:Ljava/lang/String;

常量 tag : 09 ;

常量 info[] : 00 03 00 12 , 444 個字節 , 前 222 個字節代表類信息 , 后 222 字節代表字段名稱和類型 ;

  • 00 04 類信息 ; 指向常量表中的 #4 常量 ; 類型是 Student ;
  • 00 11 方法類型 ; 指向常量表中的 #18 常量 ; 類型是 name:Ljava/lang/String ;


3、常量池 #3 常量分析


#3 常量分析 : tag 值為 07 ; tag 值為 07 的時候 , 類信息 ;

#3 = Class #19 // Student

常量 tag : 07 ;

常量 info[] : 00 13 , 222 個字節 , 指向類名所在常量 ;

  • 00 13 方法類型 ; 指向常量表中的 #19 常量 ; 類名是 Student ;


4、常量池 #4 常量分析


#4 常量分析 : tag 值為 07 ; tag 值為 07 的時候 , 類信息 ;

#4 = Class #20 // java/lang/Object

常量 tag : 07 ;

常量 info[] : 00 14 , 222 個字節 , 指向類名所在常量 ;

  • 00 14 方法類型 ; 指向常量表中的 #20 常量 ; 類名是 java/lang/Object ;


5、常量池 #5 常量分析


#5 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#5 = Utf8 name

常量 tag : 01 ;

常量 info[] : 00 04 6E 61 6D 65 ;

  • 00 04 : 表示 UTF-8 字符串 , 有 444 個字節 ;
  • 6E 61 6D 65 : 字符串內容 name ;


6、常量池 #6 常量分析


#6 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#6 = Utf8 Ljava/lang/String;

常量 tag : 01 ;

常量 info[] : 00 12 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B ;

  • 00 12 : 表示 UTF-8 字符串 , 有 181818 個字節 ;
  • 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B : 字符串內容 Ljava/lang/String; ;


7、常量池 #7 常量分析


#7 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#7 = Utf8 <init>

常量 tag : 01 ;

常量 info[] : 00 06 3C 69 6E 69 74 3E ;

  • 0006 : 表示 UTF-8 字符串 , 有 666 個字節 ;
  • 3C 69 6E 69 74 3E : 字符串內容 <init> ;


8、常量池 #8 常量分析


#8 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#8 = Utf8 ()V

常量 tag : 01 ;

常量 info[] : 00 03 28 29 56 ;

  • 00 03 : 表示 UTF-8 字符串 , 有 333 個字節 ;
  • 28 29 56 : 字符串內容 ()V ;


9、常量池 #9 常量分析


#9 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#9 = Utf8 Code

常量 tag : 01 ;

常量 info[] : 00 04 43 6F 64 65 ;

  • 00 04 : 表示 UTF-8 字符串 , 有 444 個字節 ;
  • 43 6F 64 65 : 字符串內容 Code ;


10、常量池 #10 常量分析


#10 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#10 = Utf8 LineNumberTable

常量 tag : 01 ;

常量 info[] : 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 ;

  • 00 0F : 表示 UTF-8 字符串 , 有 151515 個字節 ;
  • 4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 : 字符串內容 LineNumberTable ;


11、常量池 #11 常量分析


#11 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#11 = Utf8 getName

常量 tag : 01 ;

常量 info[] : 00 07 67 65 74 4E 61 6D 65 ;

  • 00 0F : 表示 UTF-8 字符串 , 有 151515 個字節 ;
  • 00 07 67 65 74 4E 61 6D 65 : 字符串內容 getName ;


12、常量池 #12 常量分析


#12 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#12 = Utf8 ()Ljava/lang/String;

常量 tag : 01 ;

常量 info[] : 00 14 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B ;

  • 00 14 : 表示 UTF-8 字符串 , 有 202020 個字節 ;
  • 28 29 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B : 字符串內容 ()Ljava/lang/String; ;


13、常量池 #13 常量分析


#13 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#13 = Utf8 setName

常量 tag : 01 ;

常量 info[] : 00 07 73 65 74 4E 61 6D 65 ;

  • 00 07 : 表示 UTF-8 字符串 , 有 777 個字節 ;
  • 73 65 74 4E 61 6D 65 : 字符串內容 setName ;


14、常量池 #14 常量分析


#14 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#14 = Utf8 (Ljava/lang/String;)V

常量 tag : 01 ;

常量 info[] : 00 15 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 ;

  • 00 15 : 表示 UTF-8 字符串 , 有 212121 個字節 ;
  • 28 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72 69 6E 67 3B 29 56 : 字符串內容 (Ljava/lang/String;)V ;


15、常量池 #15 常量分析


#15 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#15 = Utf8 SourceFile

常量 tag : 01 ;

常量 info[] : 00 0A 53 6F 75 72 63 65 46 69 6C 65 ;

  • 00 0A : 表示 UTF-8 字符串 , 有 101010 個字節 ;
  • 53 6F 75 72 63 65 46 69 6C 65 : 字符串內容 SourceFile ;


16、常量池 #16 常量分析


#16 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#16 = Utf8 Student.java

常量 tag : 01 ;

常量 info[] : 00 0C 53 74 75 64 65 6E 74 2E 6A 61 76 61 ;

  • 00 0C : 表示 UTF-8 字符串 , 有 121212 個字節 ;
  • 53 74 75 64 65 6E 74 2E 6A 61 76 61 : 字符串內容 Student.java ;


17、常量池 #17 常量分析


#17 常量分析 : tag 值為 0C ; 說明該常量是 名稱和類型信息 ;

#17 = NameAndType #7:#8 // "<init>":()V

常量 tag : 0C ;

常量 info[] : 00 07 00 08 ;

  • 00 07 : #7 , "<init>" ;
  • 00 08 : #8 , ()V ;


18、常量池 #18 常量分析


#18 常量分析 : tag 值為 0C ; 說明該常量是 名稱和類型信息 ;

#18 = NameAndType #5:#6 // name:Ljava/lang/String;

常量 tag : 0C ;

常量 info[] : 00 05 00 06 ;

  • 00 05 : #5 , name ;
  • 00 06 : #6 , Ljava/lang/String; ;


19、常量池 #19 常量分析


#19 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#19 = Utf8 Student

常量 tag : 01 ;

常量 info[] : 00 07 53 74 75 64 65 6E 74 ;

  • 00 07 : 表示 UTF-8 字符串 , 有 777 個字節 ;
  • 00 07 53 74 75 64 65 6E 74 : 字符串內容 Student ;


20、常量池 #20 常量分析


#20 常量分析 : tag 值為 01 ; 說明該常量是 UTF-8 字符串 ;

#20 = Utf8 java/lang/Object

常量 tag : 01 ;

常量 info[] : 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 ;

  • 00 10 : 表示 UTF-8 字符串 , 有 161616 個字節 ;
  • 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 : 字符串內容 java/lang/Object ;

總結

下圖的選中區域 , 是整個常量池的范圍 ;

本博客部分圖片轉載自 https://blog.csdn.net/luanlouis/category_9263262.html 博客

總結

以上是生活随笔為你收集整理的【Java 虚拟机原理】Class 字节码二进制文件分析 二 ( 常量池位置 | 常量池结构 | tag | info[] | 完整分析字节码文件中的常量池二进制数据 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。