Package java.lang.constant
每个读写字节码指令的API都需要对这些指令的操作数和其他类文件结构(如引导方法表中的条目或堆栈映射,这些经常引用类文件常量池中的条目)进行建模。这些条目可以表示基本类型的值,如字符串或整数;程序的部分,如类或方法句柄;或任意用户定义类型的值。ConstantDesc层次结构提供了常量池条目的名义形式表示,便于API对字节码指令的操作数进行建模。
名义描述符
ConstantDesc是常量值的描述。这样的描述是常量值的名义形式;它不是值本身,而是描述值、将值存储在常量池条目中或在类加载上下文中重新构建值的“配方”。每个ConstantDesc都知道如何解析自身 -- 计算它描述的值 -- 通过ConstantDesc.resolveConstantDesc。这允许接受ConstantDesc对象的API通过反射评估它们,前提是它们名义描述中引用的类和方法是存在且可访问的。
ConstantDesc的子类型描述各种类型的常量值。对于JVMS 4.4中定义的每种可加载常量池条目类型,都有一个相应的ConstantDesc的子类型:ClassDesc、MethodTypeDesc、DirectMethodHandleDesc、String、Integer、Long、Float、Double和DynamicConstantDesc。这些类提供特定类型的访问器方法,用于提取该类型常量的名义信息。当字节码写入API遇到一个ConstantDesc时,应该检查它以查看它是哪种类型,进行强制转换,提取其名义信息,并生成相应的常量池条目。当字节码读取API遇到一个常量池条目时,可以将其转换为适当类型的名义描述符。对于动态常量,字节码读取API可能希望使用工厂DynamicConstantDesc.ofCanonical,它将检查引导方法,并对于已知的引导方法返回更具体的DynamicConstantDesc子类型,如Enum.EnumDesc。
Constable是一个其值可以以名义形式描述为
ConstantDesc的类型。基本类型,如
String和
Class实现了
Constable,用户定义的类也可以。生成类文件的实体(如编译器)可以检查constable对象,以获得在类文件中更有效地表示其值的方法。
DynamicCallSiteDesc,它表示一个(不可加载的)
Constant_InvokeDynamic_info常量池条目。它描述了与invokedynamic指令相关的引导方法、调用名称和类型以及引导参数。它也适用于在字节码读写API中描述invokedynamic调用站点。
ModuleDesc和
PackageDesc。它们表示模块和包信息结构,适用于在字节码读写API中描述模块及其内容。
- 参见Java虚拟机规范:
-
4.4 常量池
- 自JDK版本:
- 12
-
ClassDescription名义描述符,用于表示
Class常量。表示一种可以描述自身的类型。预定义的名义描述符值,用于常见常量,包括原始类类型和其他常见平台类型的描述符,以及标准引导方法的方法句柄的描述符。名义描述符,用于直接MethodHandle。可以用DirectMethodHandleDesc描述的方法句柄类型。名义描述符,用于invokedynamic调用站点。名义描述符,用于动态常量(在常量池中用Constant_Dynamic_info描述)。名义描述符,用于MethodHandle常量。名义描述符,用于MethodType常量。一个Module常量的名义描述符。一个Package常量的名义描述符。