Module java.base

Package java.lang.constant


package java.lang.constant
用于表示运行时实体(如类或方法句柄)或类文件实体(如常量池条目或invokedynamic调用站点)的名义描述符的类和接口。这些类适用于字节码读写API、invokedynamic引导、字节码内在API和编译时或链接时程序分析工具。

每个读写字节码指令的API都需要对这些指令的操作数和其他类文件结构(如引导方法表中的条目或堆栈映射,这些经常引用类文件常量池中的条目)进行建模。这些条目可以表示基本类型的值,如字符串或整数;程序的部分,如类或方法句柄;或任意用户定义类型的值。ConstantDesc层次结构提供了常量池条目的名义形式表示,便于API对字节码指令的操作数进行建模。

名义描述符

ConstantDesc是常量值的描述。这样的描述是常量值的名义形式;它不是值本身,而是描述值、将值存储在常量池条目中或在类加载上下文中重新构建值的“配方”。每个ConstantDesc都知道如何解析自身 -- 计算它描述的值 -- 通过ConstantDesc.resolveConstantDesc。这允许接受ConstantDesc对象的API通过反射评估它们,前提是它们名义描述中引用的类和方法是存在且可访问的。

ConstantDesc的子类型描述各种类型的常量值。对于JVMS 4.4中定义的每种可加载常量池条目类型,都有一个相应的ConstantDesc的子类型:ClassDescMethodTypeDescDirectMethodHandleDescStringIntegerLongFloatDoubleDynamicConstantDesc。这些类提供特定类型的访问器方法,用于提取该类型常量的名义信息。当字节码写入API遇到一个ConstantDesc时,应该检查它以查看它是哪种类型,进行强制转换,提取其名义信息,并生成相应的常量池条目。当字节码读取API遇到一个常量池条目时,可以将其转换为适当类型的名义描述符。对于动态常量,字节码读取API可能希望使用工厂DynamicConstantDesc.ofCanonical,它将检查引导方法,并对于已知的引导方法返回更具体的DynamicConstantDesc子类型,如Enum.EnumDesc

Constable是一个其值可以以名义形式描述为 ConstantDesc的类型。基本类型,如 StringClass实现了 Constable,用户定义的类也可以。生成类文件的实体(如编译器)可以检查constable对象,以获得在类文件中更有效地表示其值的方法。

DynamicCallSiteDesc,它表示一个(不可加载的) Constant_InvokeDynamic_info常量池条目。它描述了与invokedynamic指令相关的引导方法、调用名称和类型以及引导参数。它也适用于在字节码读写API中描述invokedynamic调用站点。

ModuleDescPackageDesc。它们表示模块和包信息结构,适用于在字节码读写API中描述模块及其内容。

参见Java虚拟机规范
4.4 常量池
自JDK版本:
12