JVM之通过一个简单class二进制文件解读去熟悉类文件结构

示例代码

public class ClassTest {
    String str;

    {
        str = "static";
    }

    private int num = 1;

    public String getString(String str1) throws IOException {
        return str + num + str1;
    }
}

二进制文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

魔数
  • 行:00000000
  • 列:0-3
  • 字节数:4

ca fe ba be

次版本号
  • 行:00000000
  • 列:4-5
  • 字节数:2

00 00

主版本号

16进制34为52,jdk 1.8

  • 行:00000000
  • 列:6-7
  • 字节数:2

00 34

constant_pool_count

16进制2f为47, 常量池数量为46(从1开始计数)

  • 行:00000000
  • 列:8-9
  • 字节数:2

00 2f

constant_pool
第1个常量
  1. 常量类型标志(tag):

16进制0a为10, 第一个常量类型标志为10,指向CONSTANDT_Methodref_info

  • 行:00000000
  • 列:a
  • 字节数:1

0a

  1. 指向声明方法的类描述符CONSTANT_Class_info的索引值(index):

16进制0b为11, CONSTANT_Class_info的索引值为11,指向

  • 行:00000000
  • 列:b-c
  • 字节数:2

00 0b

  1. 指向名称及类型描述符CONSTANT_NameAndType的索引项

16进制1f为31, CONSTANT_NameAndType的索引项为31,指向

  • 行:00000000
  • 列:d-e
  • 字节数:2

00 1f

第2个常量
  1. 常量类型标志(tag):

16进制08为8, 第2个常量类型标志为8,指向CONSTANDT_String_info

  • 行:00000000
  • 列:f
  • 字节数:1

08

  1. 指向字符串字面量的索引值(index):

16进制20为32, CONSTANT_Class_info的索引值为11,指向

  • 行:00000010
  • 列:0-1
  • 字节数:2

00 20

第3个常量
  1. 常量类型标志(tag):

16进制09为9, 第3个常量类型标志为9,指向CONSTANDT_Fieldref_info

  • 行:00000010
  • 列:2
  • 字节数:1

09

  1. 指向声明字段的类或接口描述符CONSTANT_Class_info的索引值(index):

16进制0a为10, CONSTANT_Class_info的索引值为10,指向

  • 行:00000010
  • 列:3-4
  • 字节数:2

00 0a

  1. 指向字段描述符CONSTANT_NameAndType的索引项

16进制21为33, CONSTANT_NameAndType的索引项为33,指向

  • 行:00000010
  • 列:5-6
  • 字节数:2

00 21

第4个常量
  1. 常量类型标志(tag):

16进制09为9, 第4个常量类型标志为9,指向CONSTANDT_Fieldref_info

  • 行:00000010
  • 列:7
  • 字节数:1

09

  1. 指向声明字段的类或接口描述符CONSTANT_Class_info的索引值(index):

16进制0a为10, CONSTANT_Class_info的索引值为10,指向

  • 行:00000010
  • 列:8-9
  • 字节数:2

00 0a

  1. 指向字段描述符CONSTANT_NameAndType的索引项

16进制22为34, CONSTANT_NameAndType的索引项为34,指向

  • 行:00000010
  • 列:a-b
  • 字节数:2

00 22

第5个常量
  1. 常量类型标志(tag):

16进制07为7, 第5个常量类型标志为7,指向CONSTANDT_Class_info

  • 行:00000010
  • 列: c
  • 字节数:1

07

  1. 指向全限定名常量的索引值(index):

16进制00 23为35, CONSTANT_Class_info的索引值为35,指向

  • 行:00000010
  • 列: d-e
  • 字节数:2

00 23

第6个常量
  1. 常量类型标志(tag):

16进制0a为10, 第6个常量类型标志为10,指向CONSTANDT_Methodref_info

  • 行:00000010
  • 列:f
  • 字节数:1

0a

  1. 指向声明方法的类描述符CONSTANT_Class_info的索引值(index):

16进制05为5, CONSTANT_Class_info的索引值为5,指向

  • 行:00000020
  • 列:0-1
  • 字节数:2

00 05

  1. 指向名称及类型描述符CONSTANT_NameAndType的索引项

16进制1f为31, CONSTANT_NameAndType的索引项为31,指向

  • 行:00000020
  • 列:2-3
  • 字节数:2

00 1f

第7个常量
  1. 常量类型标志(tag):

16进制0a为10, 第7个常量类型标志为10,指向CONSTANDT_Methodref_info

  • 行:00000020
  • 列:4
  • 字节数:1

0a

  1. 指向声明方法的类描述符CONSTANT_Class_info的索引值(index):

16进制05为5, CONSTANT_Class_info的索引值为5,指向

  • 行:00000020
  • 列:5-6
  • 字节数:2

00 05

  1. 指向名称及类型描述符CONSTANT_NameAndType的索引项

16进制00 24为36, CONSTANT_NameAndType的索引项为36,指向

  • 行:00000020
  • 列:7-8
  • 字节数:2

00 24

第8个常量
  1. 常量类型标志(tag):

16进制0a为10, 第8个常量类型标志为10,指向CONSTANDT_Methodref_info

  • 行:00000020
  • 列:9
  • 字节数:1

0a

  1. 指向声明方法的类描述符CONSTANT_Class_info的索引值(index):

16进制05为5, CONSTANT_Class_info的索引值为5,指向

  • 行:00000020
  • 列:a-b
  • 字节数:2

00 05

  1. 指向名称及类型描述符CONSTANT_NameAndType的索引项

16进制00 25为37, CONSTANT_NameAndType的索引项为37,指向

  • 行:00000020
  • 列:c-d
  • 字节数:2

00 25

第9个常量
  1. 常量类型标志(tag):

16进制0a为10, 第9个常量类型标志为10,指向CONSTANDT_Methodref_info

  • 行:00000020
  • 列:e
  • 字节数:1

0a

  1. 指向声明方法的类描述符CONSTANT_Class_info的索引值(index):

16进制05为5, CONSTANT_Class_info的索引值为5,指向

  • 行-列:00000020-f,00000030-0
  • 字节数:2

00 05

  1. 指向名称及类型描述符CONSTANT_NameAndType的索引项

16进制00 26为38, CONSTANT_NameAndType的索引项为38,指向

  • 行:00000030
  • 列:1-2
  • 字节数:2

00 26

第10个常量
  1. 常量类型标志(tag):

16进制07为7, 第10个常量类型标志为7,指向CONSTANDT_Class_info

  • 行:00000030
  • 列: 3
  • 字节数:1

07

  1. 指向全限定名常量的索引值(index):

16进制00 27为39, CONSTANT_Class_info的索引值为39,指向

  • 行:00000030
  • 列: 4-5
  • 字节数:2

00 27

第11个常量
  1. 常量类型标志(tag):

16进制07为7, 第11个常量类型标志为7,指向CONSTANDT_Class_info

  • 行:00000030
  • 列: 6
  • 字节数:1

07

  1. 指向全限定名常量的索引值(index):

16进制00 28为40, CONSTANT_Class_info的索引值为40,指向

  • 行:00000030
  • 列: 7-8
  • 字节数:2

00 28

第12个常量
  1. 常量类型标志(tag):

16进制01为1, 第12个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000030
  • 列: 9
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 03为3, lenth为3

  • 行:00000030
  • 列: a-b
  • 字节数:2

00 03

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为3个bytes,分别为73 74 72,即字符串str

  • 行:00000030
  • 列: c-e
  • 字节数:3(单个u1)

73 74 72

第13个常量
  1. 常量类型标志(tag):

16进制01为1, 第13个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000030
  • 列: f
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 12为18, lenth为18

  • 行:00000040
  • 列: 0-1
  • 字节数:2

00 12

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为18个bytes,即字符串Ljava/lang/String;

  • 行列: 00000040,2-00000050,3
  • 字节数:18(单个u1)

4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b

第14个常量
  1. 常量类型标志(tag):

16进制01为1, 第14个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000050
  • 列: 4
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 03为3, lenth为3

  • 行:00000050
  • 列: 5-6
  • 字节数:2

00 03

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为3个bytes,即字符串num;

  • 行:00000050
  • 列: 7-9
  • 字节数:3(单个u1)

6e 75 6d

第15个常量
  1. 常量类型标志(tag):

16进制01为1, 第15个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000050
  • 列: a
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 01为1, lenth为1

  • 行:00000050
  • 列: b-c
  • 字节数:2

00 01

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为1个bytes,即字符串I

  • 行:00000050
  • 列: d
  • 字节数:1(单个u1)

49

第16个常量
  1. 常量类型标志(tag):

16进制01为1, 第16个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000050
  • 列: e
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 06为6, lenth为6

  • 行列:00000050,f-00000060,0
  • 字节数:2

00 06

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为6个bytes,即字符串

  • 行:00000060
  • 列: 1-6
  • 字节数:6(单个u1)

3c 69 6e 69 74 3e

第17个常量
  1. 常量类型标志(tag):

16进制01为1, 第17个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000060
  • 列: 7
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 03为3, lenth为3

  • 行:00000060
  • 列: 8-9
  • 字节数:2

00 03

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为3个bytes,即字符串()V

  • 行:00000060
  • 列: a-c
  • 字节数:3(单个u1)

28 29 56

第18个常量
  1. 常量类型标志(tag):

16进制01为1, 第18个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000060
  • 列: d
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 04为4, lenth为4

  • 行:00000060
  • 列: e-f
  • 字节数:2

00 04

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为4个bytes,即字符串Code

  • 行:00000070
  • 列: 0-3
  • 字节数:4(单个u1)

43 6f 64 65

第19个常量
  1. 常量类型标志(tag):

16进制01为1, 第19个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000070
  • 列: 4
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 0f为15, lenth为15

  • 行:00000070
  • 列: 5-6
  • 字节数:2

00 0f

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为15个bytes,即字符串LineNumberTable

  • 行列:00000070,7-00000080,5
  • 字节数:15(单个u1)

4c 69 6e 65 4e 75 6d 62 65 4c 69 6e 65 4e 75 6d 62 65

第20个常量
  1. 常量类型标志(tag):

16进制01为1, 第20个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000080
  • 列: 6
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 12为18, lenth为18

  • 行:00000080
  • 列: 7-8
  • 字节数:2

00 12

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为18个bytes,即字符串LocalVariableTable

  • 行列:00000080,9-00000090,a
  • 字节数:18(单个u1)

4c 6f 63 61 6c 56 61 72 69 61 62 6c 65 54 61 62 6c 65

第21个常量
  1. 常量类型标志(tag):

16进制01为1, 第21个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000090
  • 列: b
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 04为4, lenth为4

  • 行:00000090
  • 列: c-d
  • 字节数:2

00 04

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为4个bytes,即字符串this

  • 行列:00000090,e-000000a0,1
  • 字节数:4(单个u1)

74 68 69 73

第22个常量
  1. 常量类型标志(tag):

16进制01为1, 第22个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000000a0
  • 列: 2
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 25为37, lenth为37

  • 行:00000090
  • 列: c-d
  • 字节数:2

00 25

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为37个bytes,即字符串Lcom/java/study/jvm/string/ClassTest;

  • 行列:000000a0,5-000000c0,9
  • 字节数:37(单个u1)

4c 63 6f 6d 2f 6a 61 76 61 2f 73 74 75 64 79 2f 6a 76 6d 2f 73 74 72 69 6e 67 2f 43 6c 61 73 73 54 65 73 74 3b

第23个常量
  1. 常量类型标志(tag):

16进制01为1, 第23个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000000c0
  • 列: a
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 09为9, lenth为9

  • 行:000000c0
  • 列: b-c
  • 字节数:2

00 09

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为9个bytes,即字符串getString

  • 行列:000000c0,d-000000d0,5
  • 字节数:9(单个u1)

67 65 74 53 74 72 69 6e 67

第24个常量
  1. 常量类型标志(tag):

16进制01为1, 第24个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000000d0
  • 列: 6
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 26为38, lenth为38

  • 行:000000c0
  • 列: b-c
  • 字节数:2

00 26

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为38个bytes,即字符串(Ljava/lang/String;)Ljava/lang/String;

  • 行列:000000d0,9-000000f0,e
  • 字节数:38(单个u1)

28 4c 6a 61 76 61 2f 28 4c 6a 61 76 61 2f 28 4c 6a 61 76 61 2f

第25个常量
  1. 常量类型标志(tag):

16进制01为1, 第25个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000000f0
  • 列: f
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 04为4, lenth为4

  • 行:00000100
  • 列: 0-1
  • 字节数:2

00 04

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为4个bytes,即字符串str1

  • 行列:00000100,2-00000100,5
  • 字节数:4(单个u1)

73 74 72 31

第26个常量
  1. 常量类型标志(tag):

16进制01为1, 第26个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000100
  • 列: 6
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 0a为10, lenth为10

  • 行:00000100
  • 列: 0-1
  • 字节数:2

00 0a

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为4个bytes,即字符串Exceptions

  • 行列:00000100,9-00000110,2
  • 字节数:10(单个u1)

45 78 63 65 70 74 69 45 78 63 65 70 74 69

第27个常量
  1. 常量类型标志(tag):

16进制07为1, 第27个常量类型标志为1,指向CONSTANDT_Class_info

  • 行:00000110
  • 列: 3
  • 字节数:1

07

  1. 指向全限定名常量项的索引

16进制00 29为41,指向

  • 行:00000110
  • 列: 4-5
  • 字节数:2

00 29

第28个常量
  1. 常量类型标志(tag):

16进制01为1, 第28个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000110
  • 列: 6
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 10为16, lenth为16

  • 行:00000110
  • 列: 7-8
  • 字节数:2

00 10

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为16个bytes,即字符串MethodParameters

  • 行列:00000110,9-00000120,8
  • 字节数:16(单个u1)

4d 65 74 68 6f 64 50 4d 65 74 68 6f 64 50

第29个常量
  1. 常量类型标志(tag):

16进制01为1, 第29个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000120
  • 列: 9
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 0a为10, lenth为10

  • 行:00000120
  • 列: a-b
  • 字节数:2

00 0a

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为10个bytes,即字符串SourceFile

  • 行列:00000120,c-00000130,5
  • 字节数:10(单个u1)

53 6f 75 72 63 65 46 69 6c 65

第30个常量
  1. 常量类型标志(tag):

16进制01为1, 第30个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000130
  • 列: 6
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 0e为14, lenth为14

  • 行:00000130
  • 列: 7-8
  • 字节数:2

00 0e

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为14个bytes,即字符串ClassTest.java

  • 行列:00000130,9-00000140,6
  • 字节数:14(单个u1)

43 6c 61 73 73 54 65 73 74 2e 6a 61 76 61

第31个常量
  1. 常量类型标志(tag):

16进制0c为12, 第31个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000140
  • 列: 7
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 10为16, 即

  • 行:00000140
  • 列: 8-9
  • 字节数:2

00 10

  1. 指向该字段或方法描述符的常量项索引

16进制00 10为17, 即

  • 行列:00000140,a-00000140,b
  • 字节数:2

00 11

第32个常量
  1. 常量类型标志(tag):

16进制01为1, 第32个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000140
  • 列: c
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 06为6, lenth为6

  • 行:00000140
  • 列: d-e
  • 字节数:2

00 06

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为6个bytes,即字符串static

  • 行列:00000140,f-00000150,4
  • 字节数:6(单个u1)

73 74 61 74 69 63

第33个常量
  1. 常量类型标志(tag):

16进制0c为12, 第33个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000150
  • 列: 5
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 0c为12, 即

  • 行:00000150
  • 列: 6-7
  • 字节数:2

00 0c

  1. 指向该字段或方法描述符的常量项索引

16进制00 0d为13, 即

  • 行列:00000150,8-00000150,9
  • 字节数:2

00 0d

第34个常量
  1. 常量类型标志(tag):

16进制0c为12, 第34个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000150
  • 列: a
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 0e为14, 即

  • 行:00000150
  • 列: b-c
  • 字节数:2

00 0e

  1. 指向该字段或方法描述符的常量项索引

16进制00 0f为15, 即

  • 行列:00000150,d-00000150,e
  • 字节数:2

00 0f

第35个常量
  1. 常量类型标志(tag):

16进制01为1, 第35个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000150
  • 列: f
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 17为23, lenth为23

  • 行:00000160
  • 列: 0-1
  • 字节数:2

00 17

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为23个bytes,即字符串java/lang/StringBuilder

  • 行列:00000160,2-00000170,8
  • 字节数:23(单个u1)

6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72

第36个常量
  1. 常量类型标志(tag):

16进制0c为12, 第36个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000170
  • 列: 9
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 2a为42, 即

  • 行:00000170
  • 列: a-b
  • 字节数:2

00 2a

  1. 指向该字段或方法描述符的常量项索引

16进制00 2b为43, 即

  • 行列:00000170,c-00000170,d
  • 字节数:2

00 2b

第37个常量
  1. 常量类型标志(tag):

16进制0c为12, 第37个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000170
  • 列: e
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 2a为42, 即

  • 行列:00000170,f-00000180,0
  • 字节数:2

00 2a

  1. 指向该字段或方法描述符的常量项索引

16进制00 2c为44, 即

  • 行列:00000180,1-00000180,2
  • 字节数:2

00 2c

第38个常量
  1. 常量类型标志(tag):

16进制0c为12, 第38个常量类型标志为12,指向CONSTANDT_NameAndType_info

  • 行:00000180
  • 列: 3
  • 字节数:1

0c

  1. 指向该字段或方法名称的常量项索引

16进制00 2d为45, 即

  • 行列:00000180,4-00000180,5
  • 字节数:2

00 2d

  1. 指向该字段或方法描述符的常量项索引

16进制00 2e为46, 即

  • 行列:00000180,6-00000180,7
  • 字节数:2

00 2e

第39个常量
  1. 常量类型标志(tag):

16进制01为1, 第39个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000180
  • 列: 8
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 23为35, lenth为35

  • 行:00000180
  • 列: 9-a
  • 字节数:2

00 23

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为35个bytes,即字符串com/java/study/jvm/string/ClassTest

  • 行列:00000180,b-000001a0,d
  • 字节数:35(单个u1)

63 6f 6d 2f 6a 61 76 61 2f 73 74 75 64 79 2f 6a 76 6d 2f 73 74 72 69 6e 67 2f 43 6c 61 73 73 54 65 73 74

第40个常量
  1. 常量类型标志(tag):

16进制01为1, 第40个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000001a0
  • 列: e
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 10为16, lenth为16

  • 行列:000001a0,f-000001b0,0
  • 字节数:2

00 10

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为16个bytes,即字符串java/lang/Object

  • 行列:000001b0,1-000001c0,0
  • 字节数:16(单个u1)

6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74

第41个常量
  1. 常量类型标志(tag):

16进制01为1, 第41个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000001c0
  • 列: 1
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 10为19, lenth为19

  • 行列:000001c0,2-000001c0,3
  • 字节数:2

00 13

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为19个bytes,即字符串java/io/IOException

  • 行列:000001c0,4-000001d0,6
  • 字节数:19(单个u1)

6a 61 76 61 2f 69 6f 2f 49 4f 45 78 63 65 70 74 69 6f 6e

第42个常量
  1. 常量类型标志(tag):

16进制01为1, 第42个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000001d0
  • 列: 7
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 06为6, lenth为6

  • 行列:000001d0,8-000001d0,9
  • 字节数:2

00 06

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为6个bytes,即字符串append

  • 行列:000001d0,a-000001d0,f
  • 字节数:6(单个u1)

61 70 70 65 6e 64

第43个常量
  1. 常量类型标志(tag):

16进制01为1, 第43个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:000001e0
  • 列: 0
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 2d为45, lenth为45

  • 行列:000001e0,1-000001e0,2
  • 字节数:2

00 2d

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为45个bytes,即字符串(Ljava/lang/String;)Ljava/lang/StringBuilder;

  • 行列:000001e0,3-00000200,f
  • 字节数:45(单个u1)

28 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72 3b

第44个常量
  1. 常量类型标志(tag):

16进制01为1, 第44个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000210
  • 列: 0
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 1c为28, lenth为28

  • 行列:00000210,1-000001e0,2
  • 字节数:2

00 1c

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为28个bytes,即字符串(I)Ljava/lang/StringBuilder;

  • 行列:00000210,3-00000220,e
  • 字节数:28(单个u1)

28 49 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 42 75 69 6c 64 65 72 3b

第45个常量
  1. 常量类型标志(tag):

16进制01为1, 第45个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000220
  • 列: f
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 08为8, lenth为8

  • 行列:00000230,0-00000230,1
  • 字节数:2

00 08

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为8个bytes,即字符串toString

  • 行列:00000230,2-00000230,9
  • 字节数:8(单个u1)

74 6f 53 74 72 69 6e 67

第46个常量
  1. 常量类型标志(tag):

16进制01为1, 第46个常量类型标志为1,指向CONSTANDT_Utf8_info

  • 行:00000230
  • 列: a
  • 字节数:1

01

  1. UTF-8编码的字符串所占字节数

16进制00 14为20, lenth为20

  • 行列:00000230,b-00000230,c
  • 字节数:2

00 14

  1. 长度为lenth的UTF-8编码的字符串

字符串长度为20个bytes,即字符串()Ljava/lang/String;

  • 行列:00000230,d-00000250,0
  • 字节数:8(单个u1)

28 29 4c 6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 3b

此时常量池正式结束,也可用jclasslib验证结果:

在这里插入图片描述

access_flags

0x0001 | 0x0020 = 0x0021,即访问标志有ACC_PUBLIC、ACC_SUPER

  • 行:00000250
  • 列:1-2
  • 字节数:2

00 21

this_class
  • 行:00000250
  • 列:3-4
  • 字节数:2

00 0a

super_class

即先指向第11个常量,第11指向40,即java/lang/Object

  • 行:00000250
  • 列:5-6
  • 字节数:2

00 0b

interface_count

即0个接口

  • 行:00000250
  • 列:7-8
  • 字节数:2

00 00

fields_count

即2个fields

  • 行:00000250
  • 列:9-a
  • 字节数:2

00 02

fields
第一个fields
access_flags

没有任何修饰

  • 行:00000250
  • 列:b-c
  • 字节数:2

00 00

name_index

指向第12常量,即字段名字为str

  • 行:00000250
  • 列:d-e
  • 字节数:2

00 0c

descriptor_index

指向第13常量,即字段类型描述为Ljava/lang/String;

  • 行列:00000250,f-00000260,0
  • 字节数:2

00 0d

attributes_count

第一个字段属性为0

  • 行列:00000260,1-00000260,2
  • 字节数:2

00 00

第二个fields
access_flags

private修饰

  • 行:00000260
  • 列:3-4
  • 字节数:2

00 02

name_index

指向第14常量,即字段名字为num

  • 行:00000260
  • 列:5-6
  • 字节数:2

00 0e

descriptor_index

指向第15常量,即字段类型描述为I

  • 行列:00000260,7-00000260,8
  • 字节数:2

00 0f

attributes_count

第二个字段属性为0

  • 行列:00000260,9-00000260,a
  • 字节数:2

00 00

methods_count

有两个方法

  • 行列:00000260,b-00000260,c
  • 字节数:2

00 02

methods
第一个方法
access_flags

即public修饰

  • 行列:00000260,d-00000260,e
  • 字节数:2

00 01

name_index

指向常量表中第16项,即方法名为

  • 行列:00000260,f-00000270,0
  • 字节数:2

00 10

descriptor_index

指向常量表中第17项,即方法描述为()V

  • 行列:00000270,1-00000270,2
  • 字节数:2

00 11

attributes_count

此方法有一个属性

  • 行列:00000270,3-00000270,4
  • 字节数:2

00 01

attribute

attribute_name_index:
指向常量表中第18项,即此属性为coce属性

  • 行列:00000270,5-00000270,6
  • 字节数:2

00 12

attribute_length:
length为66

  • 行列:00000270,7-00000270,a
  • 字节数:4

00 00 00 42

info(code的):

  • 行列:00000270,b-000002b0,c
  • 字节数:66
第二个方法
access_flags

即public修饰

  • 行列:000002b0,d-000002b0,e
  • 字节数:2

00 01

name_index

指向常量表中第23项,即方法名为getString

  • 行列:000002b0,f-000002c0,0
  • 字节数:2

00 17

descriptor_index

指向常量表中第24项,即方法描述为(Ljava/lang/String;)Ljava/lang/String;

  • 行列:000002c0,1-000002c0,2
  • 字节数:2

00 18

attributes_count

此方法有3个属性

  • 行列:000002c0,3-000002c0,4
  • 字节数:2

00 03

attribute

第一个:

attribute_name_index:
指向常量表中第18项,即此属性为coce属性

  • 行列:000002c0,5-000002c0,6
  • 字节数:2

00 12

attribute_length:
length为81

  • 行列:000002c0,7-000002c0,a
  • 字节数:4

00 00 00 51

info(code的):

  • 行列:000002c0,b-00000310,b
  • 字节数:81

第二个:

attribute_name_index:
指向常量表中第18项,即此属性为Exceptions属性

  • 行列:00000310,c-00000310,d
  • 字节数:2

00 1a

attribute_length:
length为4

  • 行列:00000310,e-00000320,1
  • 字节数:4

00 00 00 04

number_of_exceptions:

  • 行列:00000320,2-00000320,3
  • 字节数:2

00 01

exception_index_table:
指向常量表中第27项,即为java/io/IOException

  • 行列:00000320,4-00000320,5
  • 字节数:2

00 1b

第三个:

attribute_name_index:
指向常量表中第29项,即此属性为SourceFile属性

  • 行列:00000320,6-00000320,7
  • 字节数:2

00 1c

attribute_length:
length为5

  • 行列:00000320,8-00000320,b
  • 字节数:4

00 00 00 05

attributes_count

具有一个attribute

  • 行列:00000330,1-00000330,2
  • 字节数:2

00 01

attribute_name_index:
指向常量表中第29项,即此属性为SourceFile属性

  • 行列:00000330,3-00000330,4
  • 字节数:2

00 1d

attribute_length:
length为2

  • 行列:00000330,5-00000330,8
  • 字节数:4

00 00 00 02

sourcefile_index
指向常量表中第30项,即此为ClassTest.java的sourcefile

  • 行列:00000320,9-00000320,a
  • 字节数:2

00 1e

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值