字段与方法描述符
描述符本是第二章的内容,没有在第二章详解是考虑到放在第二章可能不容易理解,因此关于描述符放在本章作为补充内容讲解。
描述符分字段描述符和方法描述符,是一个描述字段类型或方法类型的字符串。在Hello Word例子中,我们已经看到方法描述符的使用。
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;”;数组类型(ArrayType)的ComponentType表示BaseType、ObjectType、ArrayType的其中一种,比如字符串数组的类型描述符为“[Ljava/lang/String;”。类型与字段描述符的映射如下表所示。
字段描述符 | 类型 | 含义 |
---|---|---|
B | byte | 基本数据类型byte |
C | char | 基本数类型char |
D | double | 基本数据类型double |
F | float | 基本数据类型float |
I | int | 基本数据类型int |
J | long | 基本数据类型long |
L ClassName ; | reference | 引用类型 |
S | short | 基本数据类型short |
Z | boolean | 基本数据类型boolean |
[ FieldType | reference | 数组 |
字段描述符不仅用于描述字段的类型,也用于描述局部变量的类型。
方法描述符包含0个或多个参数描述符和一个返回值描述符。参数描述符表示该方法所能接受的参数类型,返回值描述符表示该方法的返回值类型。JVM根据方法名称和方法描述符在指定的类中寻找一个符合条件的方法来调用。方法的重载正是利用方法描述符区分不同的方法。
方法描述符格式:
MethodDescriptor = ({parameterDescriptor})ReturnDescriptor
如main方法的方法描述符为:“([Ljava/lang/String;)V”。
如果方法无返回值,则返回值描述符为:“V”。
发布于:2021 年 08 月 21 日
作者: 吴就业
GitHub链接:https://github.com/wujiuye/JVMByteCodeGitBook
链接: https://www.wujiuye.com/ebook/JVMByteCodeGitBook/chapter/chapter03_02.md
来源: Github Pages 开源电子书《深入浅出JVM字节码》(《Java虚拟机字节码从入门到实战》的第二版),未经作者许可,禁止转载!