- 所有已知的子接口:
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 访问控制
-