模块 java.base

类 MethodType

java.lang.Object
java.lang.invoke.MethodType
所有已实现的接口:
Serializable , Constable , TypeDescriptor , TypeDescriptor.OfMethod<Class<?>,MethodType>

public final class MethodType extends Object implements Constable , TypeDescriptor.OfMethod <Class <?>,MethodType >, Serializable
方法类型表示方法句柄接受和返回的参数和返回类型,或者方法句柄调用者传递和期望的参数和返回类型。方法类型必须在方法句柄及其所有调用者之间正确匹配,并且 JVM 的操作强制执行此匹配,特别是在调用 MethodHandle.invokeExact MethodHandle.invoke 期间,以及在执行 invokedynamic 指令期间。

该结构是一个返回类型,伴随着任意数量的参数类型。类型(原始、void 和引用)由 Class 对象表示。 (为了便于说明,我们将 void 视为一种类型。实际上,它表示没有返回类型。)

MethodType 的所有实例都是不可变的。如果两个实例比较相等,则它们完全可以互换。相等性取决于返回值和参数类型的成对对应关系,而不依赖于其他任何东西。

这种类型只能通过工厂方法创建。所有工厂方法都可以缓存值,但不能保证缓存。一些工厂方法是静态的,而其他工厂方法是修改前体方法类型的虚拟方法,例如,通过更改选定的参数。

对参数类型组进行操作的工厂方法在两个版本中系统地呈现,因此 Java 数组和 Java 列表都可以用于处理参数类型组。查询方法 parameterArrayparameterList 也提供了数组和列表之间的选择。

MethodType 对象有时源自字节码指令,例如 invokedynamic ,特别是来自与类文件常量池中的指令关联的类型描述符字符串。

与类和字符串一样,方法类型也可以直接在类文件的常量池中表示为常量。方法类型可以通过ldc 指令加载,该指令引用合适的CONSTANT_MethodType 常量池条目。该条目引用描述符字符串的 CONSTANT_Utf8 拼写。 (有关方法类型常量的完整详细信息,请参阅 Java 虚拟机规范的 4.4.85.4.3.5 部分。)

当 JVM 从描述符字符串中具体化一个 MethodType 时,描述符中命名的所有类都必须是可访问的,并且将被加载。 (但类不需要初始化,就像 CONSTANT_Class 的情况一样。)这种加载可能发生在 MethodType 对象首次派生之前的任何时间。

标称描述符

当且仅当所有参数类型和返回类型都可以用 ClassDesc 表示的 nominal descriptor 描述时, MethodType 才能在 名义形式 中描述。如果可以名义上描述方法类型,则:

如果无法名义上描述任何参数类型或返回类型,即 Class::describeConstable 返回该类型的空可选,则无法名义上描述方法类型:

自从:
1.7
参见:
  • 方法详情

    • methodType

      public static MethodType  methodType(Class <?> rtype, Class <?>[] ptypes)
      查找或创建给定方法类型的实例。
      参数:
      rtype - 返回类型
      ptypes - 参数类型
      返回:
      具有给定组件的方法类型
      抛出:
      NullPointerException - 如果 rtypeptypesptypes 的任何元素为空
      IllegalArgumentException - 如果 ptypes 的任何元素是 void.class
    • methodType

      public static MethodType  methodType(Class <?> rtype, List <Class <?>> ptypes)
      查找或创建具有给定组件的方法类型。 methodType 的便捷方法。
      参数:
      rtype - 返回类型
      ptypes - 参数类型
      返回:
      具有给定组件的方法类型
      抛出:
      NullPointerException - 如果 rtypeptypesptypes 的任何元素为空
      IllegalArgumentException - 如果 ptypes 的任何元素是 void.class
    • methodType

      public static MethodType  methodType(Class <?> rtype, Class <?> ptype0, Class <?>... ptypes)
      查找或创建具有给定组件的方法类型。 methodType 的便捷方法。前导参数类型被添加到剩余数组的前面。
      参数:
      rtype - 返回类型
      ptype0 - 第一个参数类型
      ptypes - 其余参数类型
      返回:
      具有给定组件的方法类型
      抛出:
      NullPointerException - 如果 rtypeptype0ptypesptypes 的任何元素为空
      IllegalArgumentException - 如果 ptype0ptypesptypes 的任何元素是 void.class
    • methodType

      public static MethodType  methodType(Class <?> rtype)
      查找或创建具有给定组件的方法类型。 methodType 的便捷方法。结果方法没有参数类型。
      参数:
      rtype - 返回类型
      返回:
      具有给定返回值的方法类型
      抛出:
      NullPointerException - 如果 rtype 为空
    • methodType

      public static MethodType  methodType(Class <?> rtype, Class <?> ptype0)
      查找或创建具有给定组件的方法类型。 methodType 的便捷方法。生成的方法具有单一的给定参数类型。
      参数:
      rtype - 返回类型
      ptype0 - 参数类型
      返回:
      具有给定返回值和参数类型的方法类型
      抛出:
      NullPointerException - 如果 rtypeptype0 为空
      IllegalArgumentException - 如果 ptype0void.class
    • methodType

      public static MethodType  methodType(Class <?> rtype, MethodType  ptypes)
      查找或创建具有给定组件的方法类型。 methodType 的便捷方法。生成的方法具有与 ptypes 相同的参数类型和指定的返回类型。
      参数:
      rtype - 返回类型
      ptypes - 提供参数类型的方法类型
      返回:
      具有给定组件的方法类型
      抛出:
      NullPointerException - 如果 rtypeptypes 为空
    • genericMethodType

      public static MethodType  genericMethodType(int objectArgCount, boolean finalArray)
      查找或创建一个方法类型,其组件是 Object 和一个可选的尾随 Object[] 数组。 methodType 的便捷方法。所有参数和返回类型都将是 Object ,除了最后的数组参数(如果有的话),它将是 Object[]
      参数:
      objectArgCount - 参数数量(不包括最终数组参数,如果有的话)
      finalArray - 是否会有 Object[] 类型的尾随数组参数
      返回:
      一种普遍适用的方法类型,用于给定固定参数计数的所有调用和收集的进一步参数数组
      抛出:
      IllegalArgumentException - 如果 objectArgCount 为负或大于 255(或 254,如果 finalArray 为真)
      参见:
    • genericMethodType

      public static MethodType  genericMethodType(int objectArgCount)
      查找或创建其组件均为 Object 的方法类型。 methodType 的便捷方法。所有参数和返回类型都是 Object。
      参数:
      objectArgCount - 参数数量
      返回:
      普遍适用的方法类型,用于给定参数计数的所有调用
      抛出:
      IllegalArgumentException - 如果 objectArgCount 为负数或大于 255
      参见:
    • changeParameterType

      public MethodType  changeParameterType(int num, Class <?> nptype)
      查找或创建具有单个不同参数类型的方法类型。 methodType 的便捷方法。
      指定者:
      changeParameterType 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      参数:
      num - 要更改的参数类型的索引(从零开始)
      nptype - 一种新参数类型,用于替换旧参数类型
      返回:
      相同的类型,除了更改了所选参数
      抛出:
      IndexOutOfBoundsException - 如果 num 不是 parameterArray() 的有效索引
      IllegalArgumentException - 如果 nptypevoid.class
      NullPointerException - 如果 nptype 为空
    • insertParameterTypes

      public MethodType  insertParameterTypes(int num, Class <?>... ptypesToInsert)
      查找或创建具有附加参数类型的方法类型。 methodType 的便捷方法。
      指定者:
      insertParameterTypes 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      参数:
      num - 插入的参数类型的位置(从零开始)
      ptypesToInsert - 要插入参数列表的零个或多个新参数类型
      返回:
      相同的类型,除了插入了选定的参数
      抛出:
      IndexOutOfBoundsException - 如果 num 为负或大于 parameterCount()
      IllegalArgumentException - 如果 ptypesToInsert 的任何元素是 void.class 或者生成的方法类型将具有超过 255 个参数槽
      NullPointerException - 如果 ptypesToInsert 或其任何元素为空
    • appendParameterTypes

      public MethodType  appendParameterTypes(Class <?>... ptypesToInsert)
      查找或创建具有附加参数类型的方法类型。 methodType 的便捷方法。
      参数:
      ptypesToInsert - 在参数列表末尾后插入零个或多个新参数类型
      返回:
      相同的类型,除了附加了选定的参数
      抛出:
      IllegalArgumentException - 如果 ptypesToInsert 的任何元素是 void.class 或者生成的方法类型将具有超过 255 个参数槽
      NullPointerException - 如果 ptypesToInsert 或其任何元素为空
    • insertParameterTypes

      public MethodType  insertParameterTypes(int num, List <Class <?>> ptypesToInsert)
      查找或创建具有附加参数类型的方法类型。 methodType 的便捷方法。
      参数:
      num - 插入的参数类型的位置(从零开始)
      ptypesToInsert - 要插入参数列表的零个或多个新参数类型
      返回:
      相同的类型,除了插入了选定的参数
      抛出:
      IndexOutOfBoundsException - 如果 num 为负或大于 parameterCount()
      IllegalArgumentException - 如果 ptypesToInsert 的任何元素是 void.class 或者生成的方法类型将具有超过 255 个参数槽
      NullPointerException - 如果 ptypesToInsert 或其任何元素为空
    • appendParameterTypes

      public MethodType  appendParameterTypes(List <Class <?>> ptypesToInsert)
      查找或创建具有附加参数类型的方法类型。 methodType 的便捷方法。
      参数:
      ptypesToInsert - 在参数列表末尾后插入零个或多个新参数类型
      返回:
      相同的类型,除了附加了选定的参数
      抛出:
      IllegalArgumentException - 如果 ptypesToInsert 的任何元素是 void.class 或者生成的方法类型将具有超过 255 个参数槽
      NullPointerException - 如果 ptypesToInsert 或其任何元素为空
    • dropParameterTypes

      public MethodType  dropParameterTypes(int start, int end)
      查找或创建省略了某些参数类型的方法类型。 methodType 的便捷方法。
      指定者:
      dropParameterTypes 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      参数:
      start - 要删除的第一个参数类型的索引(从零开始)
      end - 不删除后第一个参数类型的索引(大于 start
      返回:
      相同的类型,除了删除了选定的参数
      抛出:
      IndexOutOfBoundsException - 如果 start 为负或大于 parameterCount() 或者如果 end 为负或大于 parameterCount() 或者如果 start 大于 end
    • changeReturnType

      public MethodType  changeReturnType(Class <?> nrtype)
      查找或创建具有不同返回类型的方法类型。 methodType 的便捷方法。
      指定者:
      changeReturnType 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      参数:
      nrtype - 用于替换旧参数类型的返回参数类型
      返回:
      相同的类型,除了返回类型改变
      抛出:
      NullPointerException - 如果 nrtype 为空
    • hasPrimitives

      public boolean hasPrimitives()
      报告此类型是否包含原始参数或返回值。返回类型 void 算作原始类型。
      返回:
      如果任何类型是原始类型,则为真
    • hasWrappers

      public boolean hasWrappers()
      报告此类型是否包含包装器参数或返回值。包装器是包装原始值的类型,例如 Integer 。如果引用类型 java.lang.Void 作为返回类型出现,则它算作包装器。
      返回:
      如果任何类型是包装器则为真
    • erase

      public MethodType  erase()
      擦除对 Object 的所有引用类型。 methodType 的便捷方法。所有基本类型(包括 void )都将保持不变。
      返回:
      替换了所有引用类型的原始类型的版本
    • generic

      public MethodType  generic()
      将所有类型(包括引用和原始类型)转换为 ObjectgenericMethodType 的便捷方法。表达式 type.wrap().erase() 产生与 type.generic() 相同的值。
      返回:
      替换所有类型的原始类型的版本
    • wrap

      public MethodType  wrap()
      将所有原始类型转换为其相应的包装器类型。 methodType 的便捷方法。所有引用类型(包括包装器类型)都将保持不变。 void 返回类型更改为类型 java.lang.Void。表达式 type.wrap().erase() 产生与 type.generic() 相同的值。
      返回:
      替换了所有原始类型的原始类型的版本
    • unwrap

      public MethodType  unwrap()
      将所有包装器类型转换为其相应的原始类型。 methodType 的便捷方法。所有基本类型(包括 void )都将保持不变。 java.lang.Void 的返回类型更改为 void
      返回:
      替换了所有包装器类型的原始类型的版本
    • parameterType

      public Class <?> parameterType(int num)
      在此方法类型中返回指定索引处的参数类型。
      指定者:
      parameterType 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      参数:
      num - 所需参数类型的索引(从零开始)
      返回:
      选择的参数类型
      抛出:
      IndexOutOfBoundsException - 如果 num 不是 parameterArray() 的有效索引
    • parameterCount

      public int parameterCount()
      返回此方法类型中参数类型的数量。
      指定者:
      parameterCount 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      返回:
      参数类型的数量
    • returnType

      public Class <?> returnType()
      返回此方法类型的返回类型。
      指定者:
      returnType 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      返回:
      返回类型
    • parameterList

      public List <Class <?>> parameterList()
      将参数类型呈现为列表(一种便捷方法)。该列表将是不可变的。
      指定者:
      parameterList 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      返回:
      参数类型(作为不可变列表)
    • lastParameterType

      public Class <?> lastParameterType()
      返回此方法类型的最后一个参数类型。如果此类型没有参数,则返回标记值 void.class
      API 注意:

      选择标记值以便可以直接针对结果值进行反射查询。标记值不能与实际参数混淆,因为 void 永远不能作为参数类型接受。对于可变元数调用模式,表达式 lastParameterType().getComponentType() 可用于查询“varargs”参数的类型。

      返回:
      最后一个参数类型(如果有),否则为 void.class
      自从:
      10
    • parameterArray

      public Class <?>[] parameterArray()
      将参数类型呈现为数组(一种便捷方法)。对数组的更改不会导致类型发生更改。
      指定者:
      parameterArray 在接口 TypeDescriptor.OfMethod<Class<?>,MethodType>
      返回:
      参数类型(如有必要,作为新副本)
    • equals

      public boolean equals(Object  x)
      比较指定对象与此类型是否相等。也就是说,当且仅当指定的对象也是具有完全相同的参数和返回类型的方法类型时,它才返回 true
      重写:
      equals 在类 Object
      参数:
      x - 要比较的对象
      返回:
      true 如果此对象与 obj 参数相同; false否则。
      参见:
    • hashCode

      public int hashCode()
      返回此方法类型的哈希码值。它被定义为与 List 的哈希码相同,List 的元素是返回类型,后跟参数类型。
      重写:
      hashCode 在类 Object
      返回:
      此方法类型的哈希码值
      参见:
    • toString

      public String  toString()
      返回方法类型的字符串表示形式,形式为 "(PT0,PT1...)RT" 。方法类型的字符串表示形式是用括号括起来、逗号分隔的类型名称列表,紧跟在返回类型之后。

      每种类型都由其 simple name 表示。

      重写:
      toString 在类 Object
      返回:
      对象的字符串表示形式。
    • fromMethodDescriptorString

      public static MethodType  fromMethodDescriptorString(String  descriptor, ClassLoader  loader) throws IllegalArgumentException , TypeNotPresentException
      给定字节码描述符的拼写,查找或创建方法类型的实例。 methodType 的便捷方法。描述符字符串中嵌入的任何类或接口名称都将由给定的加载器解析(或者如果它为空,则在系统类加载器上解析)。

      请注意,可能会遇到无法通过此方法构造的方法类型,因为它们的组件类型并非都可以从公共类加载器访问。

      包含此方法是为了使必须生成处理方法句柄和 invokedynamic 的字节码的应用程序受益。

      参数:
      descriptor - 字节码级类型描述符字符串“(T...)T”
      loader - 在其中查找类型的类加载器
      返回:
      匹配字节码级类型描述符的方法类型
      抛出:
      NullPointerException - 如果字符串为空
      IllegalArgumentException - 如果字符串格式不正确
      TypeNotPresentException - 如果找不到命名类型
      SecurityException - 如果安全管理器存在且 loadernull 并且调用者没有 RuntimePermission ("getClassLoader")
    • toMethodDescriptorString

      public String  toMethodDescriptorString()
      返回方法类型的描述符字符串。此方法相当于调用 MethodType::descriptorString

      请注意,这不是 fromMethodDescriptorString 的严格逆。当在描述符字符串中查看时,共享共同名称但具有不同类加载器的两个不同类将看起来相同。

      包含此方法是为了使必须生成处理方法句柄和 invokedynamic 的字节码的应用程序受益。 fromMethodDescriptorString ,因为后者需要合适的类加载器参数。

      返回:
      此方法类型的描述符字符串
      Java 虚拟机规范:
      4.3.3 方法描述符
      参见:
    • descriptorString

      public String  descriptorString()
      返回此方法类型的描述符字符串。

      如果此方法类型可以是 名义上描述 ,则结果是方法类型描述符 (JVMS 4.3.3 )。可以通过使用结果描述符字符串调用 MethodTypeDesc::ofDescriptor 来生成此方法类型的 MethodTypeDesc

      如果此方法类型不能是 名义上描述 并且结果是以下形式的字符串:

      "(<parameter-descriptors>)<return-descriptor>"
      其中 <parameter-descriptors> 是所有参数类型的 描述符字符串 和返回类型的 描述符字符串 的串联。无法从结果字符串中生成MethodTypeDesc
      指定者:
      descriptorString 在接口 TypeDescriptor
      返回:
      此方法类型的描述符字符串
      Java 虚拟机规范:
      4.3.3 方法描述符
      自从:
      12
      参见:
    • describeConstable

      public Optional <MethodTypeDesc > describeConstable()
      如果可以构造,则返回此实例的标称描述符,如果不能构造,则返回一个空的 Optional
      指定者:
      describeConstable 在接口 Constable
      返回:
      包含生成的标称描述符的 Optional ,或者如果无法构造则为空的 Optional
      自从:
      12
      参见: