常量池中的项目类型有:
CONSTANT_Utf8_info tag标志位为1, UTF-8编码的字符串,比如类或接口的全限定名,参数名等
CONSTANT_Integer_info tag标志位为3, int整型字面量
CONSTANT_Float_info tag标志位为4, float浮点型字面量
CONSTANT_Long_info tag标志位为5, long长整形字面量
CONSTANT_Double_info tag标志位为6, double双精度字面量
CONSTANT_Class_info tag标志位为7, 类或接口的符号引用,指向包含字符串字面值的CONSTANT_Utf8表
CONSTANT_String_info tag标志位为8,字符串类型的字面量,指向包含字符串字面值的CONSTANT_Utf8表
CONSTANT_Fieldref_info tag标志位为9, 字段的符号引用,指向包含该字段所属类名的CONSTANT_Utf8表
CONSTANT_Methodref_info tag标志位为10,类中方法的符号引用,指向包含该方法所属类型的CONSTANT_Utf8表
CONSTANT_InterfaceMethodref_info tag标志位为11, 接口中方法的符号引用
CONSTANT_NameAndType_info tag 标志位为12,字段和方法的名称以及类型的符号引用
3.2常量池内容
接上,继续分析class中的内容,参照 jvm官方文档 ,看下常量池中究竟是什么东西
常量池1-----0A 00 06 00 0F //
1,0A---tag为10,表示第一个常量类型为CONSTANT_Methodref,参照官方文档,CONSTANT_Methodref的结构为
CONSTANT_Methodref_info { u1 tag; u2 class_index; u2 name_and_type_index; }
所以后面跟了4个字节
2,00 06---声明当前方法类描述符索引值为6 // java/lang/Object
3,00 0F---当前方法的名称和类型索引值为15 // "<init>":()V
所以,结合上文中反编译出的内容来看,这几个16进制翻译过来正好是
#1 = Methodref #6.#15 // java/lang/Object."<init>":()V
常量池2----09 00 10 00 11
1,09---tag为9,类型为CONSTANT_Fieldref
2,00 10---声明当前方法类描述符索引值为16 // java/lang/System
3,00 11---字段描述符的名称和类型索引值为17 // out:Ljava/io/PrintStream;
这几个16进制翻译过来正好是
#2 = Fieldref #16.#17 // java/lang/System.out:Ljava/io/PrintStream;
常量池3---08 00 12
1,08---tag为8,类型为CONSTANT_String,根据官方文档,其结构为
CONSTANT_String_info { u1 tag; u2 string_index; }
所以后面跟了两个字节
2,00 12---声明当前String值所在的索引值为18
当前16进制翻译过来,表示
#3 = String #18 // test