Module java.base

Class DynamicConstantDesc<T>

java.lang.Object
java.lang.constant.DynamicConstantDesc<T>
类型参数:
T - 动态常量的类型
所有实现的接口:
ConstantDesc
直接已知的子类:
Enum.EnumDesc, VarHandle.VarHandleDesc

public abstract non-sealed class DynamicConstantDesc<T> extends Object implements ConstantDesc
一个用于动态常量的名义描述符(在常量池中用Constant_Dynamic_info描述的常量)。

DynamicConstantDesc的具体子类型应该是不可变的,其行为不应依赖于对象标识。

自 JDK 版本:
12
  • Constructor Details

  • Method Details

    • ofCanonical

      public static <T> ConstantDesc ofCanonical(DirectMethodHandleDesc bootstrapMethod, String constantName, ClassDesc constantType, ConstantDesc[] bootstrapArgs)
      返回一个动态常量的名义描述符,如果常量引导是一个众所周知的引导,则将其转换为更具体的类型,如果更具体的名义描述符类型(例如ClassDesc)可用,则进行转换。

      Constable.describeConstable()方法生成一个包含众所周知引导的DynamicConstantDesc的类应该包括Class(用于描述原始类型的实例)、EnumVarHandle

      处理常量池并希望将条目作为ConstantDesc公开给其调用者的字节码读取 API 应通常优先使用此方法,而不是使用ofNamed(DirectMethodHandleDesc, String, ClassDesc, ConstantDesc...),因为这可能会导致提供给调用者更具体的类型。

      类型参数:
      T - 动态常量的类型
      参数:
      bootstrapMethod - 描述常量的引导方法的DirectMethodHandleDesc
      constantName - 将出现在此常量的LDCNameAndType操作数中的未限定名称
      constantType - 描述将出现在此常量的LDCNameAndType操作数中的类型的ClassDesc
      bootstrapArgs - 描述引导的静态参数的ConstantDesc,将出现在BootstrapMethods属性中
      返回:
      名义描述符
      抛出:
      NullPointerException - 如果任何参数为 null
      IllegalArgumentException - 如果name格式不正确
      参见 Java 虚拟机规范:
      4.2.2 未限定名称
    • ofNamed

      public static <T> DynamicConstantDesc<T> ofNamed(DirectMethodHandleDesc bootstrapMethod, String constantName, ClassDesc constantType, ConstantDesc... bootstrapArgs)
      返回一个动态常量的名义描述符。
      类型参数:
      T - 动态常量的类型
      参数:
      bootstrapMethod - 描述常量的引导方法的DirectMethodHandleDesc
      constantName - 将出现在此常量的LDCNameAndType操作数中的未限定名称
      constantType - 描述将出现在此常量的LDCNameAndType操作数中的类型的ClassDesc
      bootstrapArgs - 描述引导的静态参数的ConstantDesc,将出现在BootstrapMethods属性中
      返回:
      名义描述符
      抛出:
      NullPointerException - 如果任何参数为 null
      IllegalArgumentException - 如果name格式不正确
      参见 Java 虚拟机规范:
      4.2.2 未限定名称
    • of

      public static <T> DynamicConstantDesc<T> of(DirectMethodHandleDesc bootstrapMethod, ConstantDesc... bootstrapArgs)
      返回一个动态常量的名义描述符,其名称参数为ConstantDescs.DEFAULT_NAME,类型参数始终与引导方法的返回类型相同。
      类型参数:
      T - 动态常量的类型
      参数:
      bootstrapMethod - 描述常量的引导方法的DirectMethodHandleDesc
      bootstrapArgs - 描述引导的静态参数的ConstantDesc,将出现在BootstrapMethods属性中
      返回:
      名义描述符
      抛出:
      NullPointerException - 如果任何参数为 null
      参见 Java 虚拟机规范:
      4.2.2 未限定名称
    • of

      public static <T> DynamicConstantDesc<T> of(DirectMethodHandleDesc bootstrapMethod)
      返回一个动态常量的名义描述符,其引导没有静态参数,名称参数为ConstantDescs.DEFAULT_NAME,类型参数始终与引导方法的返回类型相同。
      类型参数:
      T - 动态常量的类型
      参数:
      bootstrapMethod - 描述常量的引导方法的DirectMethodHandleDesc
      返回:
      名义描述符
      抛出:
      NullPointerException - 如果任何参数为null
    • constantName

      public String constantName()
      返回将出现在此常量的NameAndType操作数中的名称。
      返回:
      常量名称
    • constantType

      public ClassDesc constantType()
      返回描述将出现在此常量的NameAndType操作数中的类型的ClassDesc
      返回:
      常量类型
    • bootstrapMethod

      public DirectMethodHandleDesc bootstrapMethod()
      返回描述此常量的引导方法的MethodHandleDesc
      返回:
      引导方法
    • bootstrapArgs

      public ConstantDesc[] bootstrapArgs()
      返回此常量的引导参数。
      返回:
      引导参数
    • bootstrapArgsList

      public List<ConstantDesc> bootstrapArgsList()
      返回此常量的引导参数作为不可变的List
      返回:
      引导参数的List
    • resolveConstantDesc

      public T resolveConstantDesc(MethodHandles.Lookup lookup) throws ReflectiveOperationException
      从接口复制的描述: ConstantDesc
      反射解析此描述符,模拟JVMS 5.4.3的解析行为和JVMS 5.4.4的访问控制行为。解析和访问控制上下文由MethodHandles.Lookup参数提供。不执行结果值的缓存。
      指定者:
      resolveConstantDesc 在接口 ConstantDesc
      参数:
      lookup - 提供名称解析和访问控制上下文的MethodHandles.Lookup
      返回:
      已解析的常量值
      抛出:
      ReflectiveOperationException - 如果在解析过程中无法反射解析类、方法或字段
    • equals

      public final boolean equals(Object o)
      将指定的对象与此描述符进行比较以确定是否相等。仅当指定的对象也是DynamicConstantDesc,并且两个描述符具有相等的引导方法、引导参数列表、常量名称和常量类型时,才返回true
      覆盖:
      equals 在类 Object
      参数:
      o - 要与此DynamicConstantDesc比较的DynamicConstantDesc
      返回:
      如果指定的DynamicConstantDesc等于此DynamicConstantDesc,则返回true
      参见:
    • hashCode

      public final int hashCode()
      从类复制的描述: Object
      返回此对象的哈希码值。此方法支持哈希表(如HashMap)的好处。

      hashCode的一般约定是:

      • 在Java应用程序的执行过程中,如果在同一对象上多次调用它,则hashCode方法必须一致地返回相同的整数,前提是在对象上用于equals比较的信息未被修改。这个整数不需要在一个应用程序的执行到另一个应用程序的执行之间保持一致。
      • 如果两个对象根据equals方法是相等的,则在这两个对象的每个对象上调用hashCode方法必须产生相同的整数结果。
      • 不要求如果两个对象根据equals方法是不相等的,则在这两个对象的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象产生不同的整数结果可能会提高哈希表的性能。
      覆盖:
      hashCode 在类 Object
      返回:
      此对象的哈希码值。
      参见:
    • toString

      public String toString()
      返回此常量描述的紧凑文本描述,包括引导方法、常量名称和类型以及静态引导参数。
      覆盖:
      toString 在类 Object
      返回:
      此调用站点描述的紧凑文本描述