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
常量的名义描述符。