- 已知的所有子接口:
-
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)
来解析,以产生常量值本身。
名义描述符中的类名,就像类文件的常量池中的类名一样,必须根据特定的类加载器进行解释,这不是名义描述符的一部分。
可以在常量池中本地表达的静态常量(String
、Integer
、Long
、Float
和Double
)实现了ConstantDesc
,并作为它们自身的名义描述符。本机可链接的常量(Class
、MethodType
和MethodHandle
)有对应的ConstantDesc类型:ClassDesc
、MethodTypeDesc
和MethodHandleDesc
。其他常量由DynamicConstantDesc
的子类型表示。
执行或解析字节码的API应该使用ConstantDesc来描述ldc
指令的操作数(包括动态常量)、动态常量的静态引导参数和invokedynamic
指令,以及其他使用常量池的字节码或类文件结构。
描述各种常见常量的常量(例如平台类型的ClassDesc
实例)可以在ConstantDescs
中找到。
ConstantDesc的实现应该是不可变的,其行为不应依赖于对象标识。
非平台类不应直接实现ConstantDesc。相反,它们应该扩展DynamicConstantDesc
(如Enum.EnumDesc
和VarHandle.VarHandleDesc
所做的那样)。
名义描述符应该使用Object.equals(Object)
方法进行比较。不能保证任何特定实体始终由相同的描述符实例表示。
- 参见Java虚拟机规范:
-
4.4 常量池
- 封闭类层次结构图:
- 自JDK版本:
- 12
- 参见:
-
Method Summary
Modifier and TypeMethodDescription
-
Method Details
-
resolveConstantDesc
- API注释:
- 一些常量描述符,如MethodTypeDesc,可以表示运行时实体无法表示的值。尝试解析这些值可能会导致错误。
- 参数:
-
lookup
- 提供名称解析和访问控制上下文的MethodHandles.Lookup
- 返回值:
- 已解析的常量值
- 抛出:
-
ReflectiveOperationException
- 如果在解析过程中无法反射解析类、方法或字段 -
LinkageError
- 如果发生链接错误 - 参见Java虚拟机规范:
-
5.4.3 解析
5.4.4 访问控制
-