实例探索Class文件(2)

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

其终结符号如下:

实例探索Class文件

以深入java虚拟机上的示例作为参考:

     

实例探索Class文件

实例探索Class文件

下面看class文件内常量池部分: 首先是常量池数:即(0x35)53个常量池

Java虚拟机将常量池组织成为列表(可以看做是一个常量池的数组)的形式,常量池内容可能指向其他常量池,并且class文件中其他部分内容也可能指向常量池入口,这些常量池通过该常量池在常量池列表中的索引来定位,常量池列表的0号常量池其实是空的,作为常量池的NULL引用,即常量池列表的第一项实际上是1号常量池,常量池列表实际上只有constant_pool_count - 1个常量池项。 随后是常量池列表,常量池的结构如下:

cp_info{ tag, info }

常量池的固定第一个字节是常量值标签,用来描述该常量池保存内容的类型,常量池标志和含义如下:

实例探索Class文件

 

根据常量池标志tag的不同,info有不同的组织方式:

(1).CONSTANT_Utf8结构:

 

(可以看出length由2个字节表示,最大长度就应该是65536字节)

该类型是一个长度可变(长度为length)的常量字符串表,用来存储以下类型的字符串:

文字字符串,如String对象的内容

当前类或接口的全限定名

当前类的超类的全限定名

当前类或接口的父接口的全限定名

字段的简单名称或描述符

方法的简单名称或描述符

引用类或接口的全限定名

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/21d552f6d5eec79a30d2df013e6c86d7.html