FieldDescriptor:
FieldType
ComponentType:
FieldType
FieldType:
BaseType
ObjectType
ArrayType
BaseType:
B
C
D
F
I
J
S
Z
ObjectType:
L<classname>;
ArrayType:
[ComponentType
MethodDescriptor:
(ParameterDescriptor*) ReturnDescriptor
ParameterDescriptor:
FieldType
ReturnDescriptor:
FieldType
V
其终结符号如下:
以深入java虚拟机上的示例作为参考:
下面看class文件内常量池部分: 首先是常量池数:即(0x35)53个常量池
Java虚拟机将常量池组织成为列表(可以看做是一个常量池的数组)的形式,常量池内容可能指向其他常量池,并且class文件中其他部分内容也可能指向常量池入口,这些常量池通过该常量池在常量池列表中的索引来定位,常量池列表的0号常量池其实是空的,作为常量池的NULL引用,即常量池列表的第一项实际上是1号常量池,常量池列表实际上只有constant_pool_count - 1个常量池项。 随后是常量池列表,常量池的结构如下:
cp_info{ tag, info }
常量池的固定第一个字节是常量值标签,用来描述该常量池保存内容的类型,常量池标志和含义如下:
根据常量池标志tag的不同,info有不同的组织方式:
(1).CONSTANT_Utf8结构:
(可以看出length由2个字节表示,最大长度就应该是65536字节)
该类型是一个长度可变(长度为length)的常量字符串表,用来存储以下类型的字符串:
文字字符串,如String对象的内容
当前类或接口的全限定名
当前类的超类的全限定名
当前类或接口的父接口的全限定名
字段的简单名称或描述符
方法的简单名称或描述符
引用类或接口的全限定名