Module java.base

Interface ConstantDesc

已知的所有子接口:
ClassDesc, DirectMethodHandleDesc, MethodHandleDesc, MethodTypeDesc

public sealed interface ConstantDesc permits ClassDesc, MethodHandleDesc, MethodTypeDesc, Double, DynamicConstantDesc<T>, Float, Integer, Long, String
一个名义描述符用于可加载的常量值,如JVMS 4.4中定义的。这样的描述符可以通过resolveConstantDesc(MethodHandles.Lookup)来解析,以产生常量值本身。

名义描述符中的类名,就像类文件的常量池中的类名一样,必须根据特定的类加载器进行解释,这不是名义描述符的一部分。

可以在常量池中本地表达的静态常量(StringIntegerLongFloatDouble)实现了ConstantDesc,并作为它们自身的名义描述符。本机可链接的常量(ClassMethodTypeMethodHandle)有对应的ConstantDesc类型:ClassDescMethodTypeDescMethodHandleDesc。其他常量由DynamicConstantDesc的子类型表示。

执行或解析字节码的API应该使用ConstantDesc来描述ldc指令的操作数(包括动态常量)、动态常量的静态引导参数和invokedynamic指令,以及其他使用常量池的字节码或类文件结构。

描述各种常见常量的常量(例如平台类型的ClassDesc实例)可以在ConstantDescs中找到。

ConstantDesc的实现应该是不可变的,其行为不应依赖于对象标识。

非平台类不应直接实现ConstantDesc。相反,它们应该扩展DynamicConstantDesc(如Enum.EnumDescVarHandle.VarHandleDesc所做的那样)。

名义描述符应该使用Object.equals(Object)方法进行比较。不能保证任何特定实体始终由相同的描述符实例表示。

参见Java虚拟机规范:
4.4 常量池
封闭类层次结构图:
ConstantDesc的封闭类层次结构图ConstantDesc的封闭类层次结构图
自JDK版本:
12
参见: