Module java.base
Package java.lang.invoke

Class 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.invokeExactMethodHandle.invoke以及执行invokedynamic指令时强制执行此匹配。

结构是一个返回类型和任意数量的参数类型。这些类型(原始类型、void和引用类型)由Class对象表示。(为了方便起见,我们将void视为一种类型。实际上,它表示没有返回类型。)

所有MethodType实例都是不可变的。如果它们相等,则两个实例完全可以互换。相等性取决于返回类型和参数类型的一一对应以及其他任何因素。

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

操作参数类型组的工厂方法以两个版本系统地呈现,以便可以使用Java数组和Java列表来处理参数类型组。查询方法parameterArrayparameterList还提供了数组和列表之间的选择。

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

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

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

名义描述符

如果所有参数类型和返回类型都可以用nominal descriptor表示的ClassDesc描述,则可以用名义形式描述MethodType。如果方法类型可以被名义描述,则:

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

自版本:
1.7
参见:
  • Method Details

    • methodType

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

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

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

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

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

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

      public static MethodType genericMethodType(int objectArgCount, boolean finalArray)
      找到或创建其组件为Object的方法类型,带有可选的尾随Object[]数组。方便方法为methodType。所有参数和返回类型将为Object,除非有最终数组参数(如果有的话),那将为Object[]
      参数:
      objectArgCount - 参数数量(不包括最终数组参数)
      finalArray - 是否会有一个尾随的数组参数,类型为Object[]
      返回:
      一个通用适用的方法类型,适用于给定固定参数数量的所有调用和进一步参数的收集数组
      抛出:
      IllegalArgumentException - 如果objectArgCount为负数或大于255(如果finalArray为true,则为254)
      参见:
    • 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为null
    • 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或其任何元素为null
    • appendParameterTypes

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

      public MethodType insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
      找到或创建具有省略某些参数类型的方法类型。方便方法为methodType
      Parameters:
      num - the position (zero-based) of the inserted parameter type(s)
      ptypesToInsert - zero or more new parameter types to insert into the parameter list
      Returns:
      the same type, except with the selected parameter(s) inserted
      Throws:
      IndexOutOfBoundsException - if num is negative or greater than parameterCount()
      IllegalArgumentException - if any element of ptypesToInsert is void.class or if the resulting method type would have more than 255 parameter slots
      NullPointerException - if ptypesToInsert or any of its elements is null
    • appendParameterTypes

      public MethodType appendParameterTypes(List<Class<?>> ptypesToInsert)
      Finds or creates a method type with additional parameter types. Convenience method for methodType.
      Parameters:
      ptypesToInsert - zero or more new parameter types to insert after the end of the parameter list
      Returns:
      the same type, except with the selected parameter(s) appended
      Throws:
      IllegalArgumentException - if any element of ptypesToInsert is void.class or if the resulting method type would have more than 255 parameter slots
      NullPointerException - if ptypesToInsert or any of its elements is null
    • dropParameterTypes

      public MethodType dropParameterTypes(int start, int end)
      Finds or creates a method type with some parameter types omitted. Convenience method for 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为null
    • hasPrimitives

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

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

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

      public MethodType generic()
      将所有类型(包括引用和原始类型)转换为Object。方便方法为genericMethodType。表达式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()对于查询“可变参数”参数的类型很有用。

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

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

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

      public int hashCode()
      返回此方法类型的哈希码值。它被定义为具有返回类型后跟参数类型的列表的哈希码的相同值。
      覆盖:
      hashCode 在类 Object
      返回:
      此方法类型的哈希码值
      参见:
    • toString

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

      每种类型由其简单名称表示。

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

      public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException, TypeNotPresentException
      查找或创建给定方法描述符的方法类型实例(JVMS 4.3.3)。此方法是 methodType 的便利方法。描述符字符串中嵌入的任何类或接口名称将由给定的加载器解析(如果为null,则在系统类加载器上解析)。
      API 注意:
      可能会遇到具有有效描述符但无法通过此方法构造的方法类型,因为它们的组件类型对于通用类加载器不可见。

      此方法包含在必须生成处理方法句柄和invokedynamic的字节码的应用程序的利益。

      参数:
      descriptor - 方法描述符字符串
      loader - 要查找类型的类加载器
      返回:
      给定方法描述符的方法类型
      抛出:
      NullPointerException - 如果字符串为null
      IllegalArgumentException - 如果字符串不是方法描述符
      TypeNotPresentException - 如果找不到命名类型
      SecurityException - 如果存在安全管理器且loadernull且调用者没有RuntimePermission("getClassLoader")
      参见 Java虚拟机规范
      4.3.3 方法描述符
    • toMethodDescriptorString

      public String toMethodDescriptorString()
      返回此方法类型的描述符字符串。此方法等效于调用MethodType::descriptorString
      API 注意:
      这不是fromMethodDescriptorString的严格反函数,后者需要方法类型描述符(JVMS 4.3.3)和适当的类加载器参数。两个不同的MethodType对象可以具有相同的描述符字符串,因为不同的类可以具有相同的名称但不同的类加载器。

      此方法包含在必须生成处理方法句柄和invokedynamic的字节码的应用程序的利益。

      返回:
      此方法类型的描述符字符串
      参见 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
      另请参阅: