模块  java.base
软件包  java.lang.invoke

Class MethodType

  • 实现的所有接口
    Serializable

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

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

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

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

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

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

    与类和字符串一样,方法类型也可以直接在类文件的常量池中表示为常量。 一种方法类型可以由一个装载ldc指令,它是指适当CONSTANT_MethodType常量存储库项。 该条目引用描述符字符串的CONSTANT_Utf8拼写。 (有关方法类型常量的完整详细信息,请参阅Java虚拟机规范的4.4.8和5.4.3.5节。)

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

    从以下版本开始:
    1.7
    另请参见:
    Serialized Form
    • 方法详细信息

      • methodType

        public static MethodType methodType​(<?> rtype,
                                            <?>[] ptypes)
        查找或创建给定方法类型的实例。
        参数
        rtype - 返回类型
        ptypes - 参数类型
        结果
        具有给定组件的方法类型
        异常
        NullPointerException -如果 rtypeptypes或任何元件 ptypes为空
        IllegalArgumentException -如果任何元件 ptypesvoid.class
      • methodType

        public static MethodType methodType​(<?> rtype,
                                            List<<?>> ptypes)
        查找或创建具有给定组件的方法类型。 便捷方法methodType
        参数
        rtype - 返回类型
        ptypes - 参数类型
        结果
        具有给定组件的方法类型
        异常
        NullPointerException -如果 rtypeptypes或任何元件 ptypes为空
        IllegalArgumentException -如果任何元件 ptypesvoid.class
      • methodType

        public static MethodType methodType​(<?> rtype,
                                            <?> ptype0,
                                            <?>... ptypes)
        查找或创建具有给定组件的方法类型。 便捷方法methodType 前导参数类型前置于剩余的数组。
        参数
        rtype - 返回类型
        ptype0 - 第一个参数类型
        ptypes - 其余参数类型
        结果
        具有给定组件的方法类型
        异常
        NullPointerException -如果 rtypeptype0ptypes或任何元件 ptypes为空
        IllegalArgumentException - 如果 ptype0ptypes或任何元素 ptypesvoid.class
      • methodType

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

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

        public static MethodType methodType​(<?> 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(int)
      • genericMethodType

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

        public MethodType changeParameterType​(int num,
                                              <?> nptype)
        查找或创建具有单个不同参数类型的方法类型。 便利方法methodType
        参数
        num - 要更改的参数类型的索引(从零开始)
        nptype - 用于替换旧参数的新参数类型
        结果
        相同类型,但所选参数已更改
        异常
        IndexOutOfBoundsException -如果 num不是有效的索引 parameterArray()
        IllegalArgumentException - 如果 nptypevoid.class
        NullPointerException - 如果 nptype为空
      • insertParameterTypes

        public MethodType insertParameterTypes​(int num,
                                               <?>... ptypesToInsert)
        查找或创建具有其他参数类型的方法类型。 便捷方法methodType
        参数
        num - 插入的参数类型的位置(从零开始)
        ptypesToInsert - 要插入参数列表的零个或多个新参数类型
        结果
        相同的类型,除了插入了所选参数
        异常
        IndexOutOfBoundsException - 如果 num为负数或大于 parameterCount()
        IllegalArgumentException -如果任何元件 ptypesToInsertvoid.class ,或者如果所产生的方法类型将具有255个以上的参数时隙
        NullPointerException - 如果 ptypesToInsert或其任何元素为null
      • appendParameterTypes

        public MethodType appendParameterTypes​(<?>... ptypesToInsert)
        查找或创建具有其他参数类型的方法类型。 便捷方法methodType
        参数
        ptypesToInsert - 在参数列表结束后插入零个或多个新参数类型
        结果
        相同的类型,除了附加的选定参数
        异常
        IllegalArgumentException -如果任何元件 ptypesToInsertvoid.class ,或者如果所产生的方法类型将具有255个以上的参数时隙
        NullPointerException - 如果 ptypesToInsert或其任何元素为null
      • insertParameterTypes

        public MethodType insertParameterTypes​(int num,
                                               List<<?>> ptypesToInsert)
        查找或创建具有其他参数类型的方法类型。 便捷方法methodType
        参数
        num - 插入的参数类型的位置(从零开始)
        ptypesToInsert - 要插入参数列表的零个或多个新参数类型
        结果
        相同的类型,除了插入了所选参数
        异常
        IndexOutOfBoundsException - 如果 num为负数或大于 parameterCount()
        IllegalArgumentException -如果任何元件 ptypesToInsertvoid.class ,或者如果所产生的方法类型将具有255个以上的参数时隙
        NullPointerException - 如果 ptypesToInsert或其任何元素为null
      • appendParameterTypes

        public MethodType appendParameterTypes​(List<<?>> ptypesToInsert)
        查找或创建具有其他参数类型的方法类型。 便捷方法methodType
        参数
        ptypesToInsert - 在参数列表结束后插入零个或多个新参数类型
        结果
        相同的类型,除了附加的选定参数
        异常
        IllegalArgumentException -如果任何元件 ptypesToInsertvoid.class ,或者如果所产生的方法类型将具有255个以上的参数时隙
        NullPointerException - 如果 ptypesToInsert或其任何元素为null
      • dropParameterTypes

        public MethodType dropParameterTypes​(int start,
                                             int end)
        查找或创建省略了某些参数类型的方法类型。 便利方法methodType
        参数
        start - 要删除的第一个参数类型的索引(从零开始)
        end - 不删除后第一个参数类型的索引(大于 start
        结果
        相同类型,除非删除了所选参数
        异常
        IndexOutOfBoundsException - 如果 start是负数或大于 parameterCount()或者如果 end是负数或大于 parameterCount()或者如果 start是大于 end
      • changeReturnType

        public MethodType changeReturnType​(<?> nrtype)
        查找或创建具有不同返回类型的方法类型。 便捷方法methodType
        参数
        nrtype - 用于替换旧的返回参数类型
        结果
        相同类型,但返回类型更改除外
        异常
        NullPointerException - 如果 nrtype为空
      • 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 所有引用类型(包括包装类型)将保持不变。 A void返回类型已更改为类型java.lang.Void 表达type.wrap().erase()产生相同的值type.generic()
        结果
        原始类型的一个版本,替换了所有基本类型
      • unwrap

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

        public <?> parameterType​(int num)
        返回此方法类型中指定索引处的参数类型。
        参数
        num - 所需参数类型的索引(从零开始)
        结果
        选定的参数类型
        异常
        IndexOutOfBoundsException -如果 num不是有效的索引 parameterArray()
      • parameterCount

        public int parameterCount()
        返回此方法类型中的参数类型数。
        结果
        参数类型的数量
      • returnType

        public <?> returnType()
        返回此方法类型的返回类型。
        结果
        返回类型
      • parameterList

        public List<<?>> parameterList()
        将参数类型显示为列表(便捷方法)。 该列表将是不可变的。
        结果
        参数类型(作为不可变列表)
      • lastParameterType

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

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

        结果
        最后一个参数类型(如果有),否则为 void.class
        从以下版本开始:
        10
      • parameterArray

        public <?>[] parameterArray()
        将参数类型表示为数组(便捷方法)。 对数组的更改不会导致对类型的更改。
        结果
        参数类型(如有必要,作为新副本)
      • equals

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

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

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

        每种类型由其simple name表示。

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

        public static MethodType fromMethodDescriptorString​(String descriptor,
                                                            ClassLoader loader)
                                                     throws IllegalArgumentException,
                                                            TypeNotPresentException
        在给定字节码描述符的拼写的情况下,查找或创建方法类型的实例。 便捷方法methodType 嵌入在描述符字符串中的任何类或接口名称将通过在给定加载器上调用ClassLoader.loadClass(java.lang.String)来解析(或者如果它是null,则在系统类加载器上)。

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

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

        参数
        descriptor - 字节码级类型描述符字符串“(T ...)T”
        loader - 用于查找类型的类加载器
        结果
        匹配字节码级别类型描述符的方法类型
        异常
        NullPointerException - 如果字符串为null
        IllegalArgumentException - 如果字符串格式不正确
        TypeNotPresentException - 如果找不到命名类型
      • toMethodDescriptorString

        public String toMethodDescriptorString()
        生成方法类型的字节码描述符表示。

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

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

        结果
        字节码类型描述符表示