jvm类文件结构(续)

105 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

  • 第#1项 0a 表示一个 Method 信息,00 06 和 00 15(21) 表示它引用了常量池中 #6 和 #21 项来获得 这个方法的【所属类】和【方法名】

    • 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09
  • 第#2项 09 表示一个 Field 信息,00 16(22)和 00 17(23) 表示它引用了常量池中 #22 和 # 23 项 来获得这个成员变量的【所属类】和【成员变量名】

    • 0000000 ca fe ba be 00 00 00 34 00 23 0a 00 06 00 15 09
    • 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
  • 第#3项 08 表示一个字符串常量名称,00 18(24)表示它引用了常量池中 #24 项

    • 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
  • 第#4项 0a 表示一个 Method 信息,00 19(25) 和 00 1a(26) 表示它引用了常量池中 #25 和 #26 项来获得这个方法的【所属类】和【方法名】

    • 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
  • 第#5项 07 表示一个 Class 信息,00 1b(27) 表示它引用了常量池中 #27 项

    • 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
  • 第#6项 07 表示一个 Class 信息,00 1c(28) 表示它引用了常量池中 #28 项

    • 0000020 00 16 00 17 08 00 18 0a 00 19 00 1a 07 00 1b 07
    • 0000040 00 1c 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29
  • 第#7项 01 表示一个 utf8 串,00 06 表示长度,3c 69 6e 69 74 3e 是【】

    • 0000040 00 1c 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29
  • 第#8项 01 表示一个 utf8 串,00 03 表示长度,28 29 56 是【()V】其实就是表示无参、无返回值

    • 0000040 00 1c 01 00 06 3c 69 6e 69 74 3e 01 00 03 28 29
    • 0000060 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e
  • 第#9项 01 表示一个 utf8 串,00 04 表示长度,43 6f 64 65 是【Code】

    • 0000060 56 01 00 04 43 6f 64 65 01 00 0f 4c 69 6e 65 4e

(4)访问标识与继承信息

  • 21 表示该 class 是一个类,公共的

    • 0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 05
  • 表示根据常量池中 #5 找到本类全限定名

    • 0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01 06
  • 表示根据常量池中 #6 找到父类全限定名

    • 0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01
  • 表示接口的数量,本类为 0

    • 0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01

image-20220401113629980

(5)Field 信息

表示成员变量数量,本类为 0

0000660 29 56 00 21 00 05 00 06 00 00 00 00 00 02 00 01

image-20220401113716837

(6)Method 信息

image-20220401113820105

image-20220401113836995

image-20220401113856598

image-20220401113912598

(7)附加属性

  • 00 01 表示附加属性数量
  • 00 13 表示引用了常量池 #19 项,即【SourceFile】
  • 00 00 00 02 表示此属性的长度
  • 00 14 表示引用了常量池 #20 项,即【HelloWorld.java】

0001100 00 12 00 00 00 05 01 00 10 00 00 00 01 00 13 00

0001120 00 00 02 00 14

参考文献 docs.oracle.com/javase/spec…