Module  java.base
软件包  java.lang.invoke

Class MethodType

  • All Implemented Interfaces:
    Serializable


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

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

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

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

    以两个版本的方式系统地显示了对参数类型组进行操作的工厂方法,从而可以使用Java数组和Java列表来处理参数类型组。 查询方法parameterArrayparameterList还提供了数组和列表之间的选择。

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

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

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

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

      • methodType

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

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

        public static MethodType methodType​(Class<?> rtype,
                                            Class<?> ptype0,
                                            Class<?>... ptypes)
        查找或创建具有给定组件的方法类型。 方便methodType方法。 前导参数类型被添加到剩余的数组中。
        参数
        rtype - 返回类型
        ptype0 - 第一个参数类型
        ptypes - 剩余的参数类型
        结果
        具有给定组件的方法类型
        异常
        NullPointerException -如果 rtypeptype0ptypes或任何元件 ptypes为空
        IllegalArgumentException -如果 ptype0ptypes或任何元件 ptypesvoid.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(int)
      • genericMethodType

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

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

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

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

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

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

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

        public MethodType changeReturnType​(Class<?> nrtype)
        查找或创建具有不同返回类型的方法类型。 methodType方便方法。
        参数
        nrtype - 一个返回参数类型替换旧的
        结果
        相同类型,除了返回类型更改
        异常
        NullPointerException - 如果 nrtype为空
      • hasPrimitives

        public boolean hasPrimitives​()
        报告此类型是否包含原始参数或返回值。 返回类型void计数为原始数。
        结果
        如果任何类型是原语,则为真
      • 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 Class<?> parameterType​(int num)
        在此方法类型中返回指定索引处的参数类型。
        参数
        num - 所需参数类型的索引(从零开始)
        结果
        所选参数类型
        异常
        IndexOutOfBoundsException - 如果 num不是有效的索引到 parameterArray()
      • parameterCount

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

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

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

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

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

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

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

        每种类型由其simple name表示。

        重写:
        toStringObject
        结果
        对象的字符串表示形式。
      • 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 - 如果字符串为空
        IllegalArgumentException - 如果字符串格式不正确
        TypeNotPresentException - 如果找不到命名类型
      • toMethodDescriptorString

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

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

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

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