字段与方法描述符
字段与方法描述符
描述符本是第二章的内容,没有在第二章详解是考虑到放在第二章可能不容易理解,因此关于描述符放在本章作为补充内容讲解。
描述符分字段描述符和方法描述符,是一个描述字段类型或方法类型的字符串。在Hello Word例子中,我们已经看到方法描述符的使用,invokevirtual指令要求操作数告知JVM该指令调用的是哪个方法。
字段描述符用来表示类、实例、局部变量、字段的类型,Class文件结构的字段表中每个字段都有一个描述符索引,该索引指向常量池中表示该字段的类型描述符的CONSTANT_Utf8_info常量。参照《Java虚拟机规范》,类型描述符规范如下。
BaseType: one of B C D F I J S Z ObjectType: L ClassName ; ArrayType: [ ComponentType ComponentType: FieldType(BaseType、ObjectType、ArrayType)
对象类型ObjectType的ClassName表示一个类或接口的名称,如String类型的类型描述符为“Ljava/lang/String;”;数组类型ComponentType表示BaseType、ObjectType、ArrayType的其中一种,比如字符串数组的类型描述符为“[Ljava/lang/String;”。类型与字段描述符的映射如表3-3所示。
表3-3 字段类型描述符表

使用getfield和putfield指令访问对象的字段,与使用getstatic和putstatic访问静态字段,都需要带上一个操作数,告诉JVM该指令操作的字段的是哪个类的字段,字段名是什么以及字段的类型是什么。此外,还有new、checkcast、instanceof指令要求操作数也是指向常量池中的类型描述符CONSTANT_Utf8_info常量的索引。
方法描述符包含0个或多个参数描述符和一个返回值描述符。参数描述符表示该方法所能接受的参数类型,返回值描述符表示该方法的返回值类型。JVM根据方法名称和方法描述符在指定的类中寻找一个符合条件的方法来调用。方法的重载正是利用方法描述符区分不同的方法。
方法描述符格式:
MethodDescriptor = ({parameterDescriptor})ReturnDescriptor
如main方法的方法描述符为:“([Ljava/lang/String;)V”。
如果方法无返回值,则返回值描述符为:“V”。