- 所有已知的子接口:
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
指令的静态引导参数,以及使用常量的其他字节码或类文件结构水池。
可以在 ConstantDescs
中找到描述各种通用常量的常量(例如 ClassDesc
平台类型的实例)。
ConstantDesc 的实现应该是不可变的,它们的行为不应该依赖于对象身份。
非平台类不应直接实现 ConstantDesc。相反,它们应该扩展 DynamicConstantDesc
(就像 Enum.EnumDesc
和 VarHandle.VarHandleDesc
那样。)
应使用 Object.equals(Object)
方法比较标称描述符。无法保证任何特定实体将始终由相同的描述符实例表示。
- 看Java 虚拟机规范:
-
4.4 常量池
- 密封类层次结构图:
- 自从:
- 12
- 参见:
-
方法总结
修饰符和类型方法描述
-
方法详情
-
resolveConstantDesc
- API 注意:
- MethodTypeDesc 可以表示 MethodType 无法表示的方法类型描述符,例如具有超过 255 个参数槽的方法,因此尝试解析这些可能会导致错误。
- 参数:
lookup
-MethodHandles.Lookup
提供名称解析和访问控制上下文- 返回:
- 解析的常量值
- 抛出:
ReflectiveOperationException
- 如果类、方法或字段在解析过程中无法反射解析LinkageError
- 如果发生链接错误- 看Java 虚拟机规范:
-
5.4.3 分辨率
5.4.4 访问控制
-