- java.lang.Object
-
- java.lang.invoke.MethodType
-
- 实现的所有接口
-
Serializable
public final class MethodType extends Object implements Serializable
方法类型表示方法句柄接受和返回的参数和返回类型,或方法句柄调用者传递和期望的参数和返回类型。 方法类型必须在方法句柄及其所有调用方之间正确匹配,并且JVM的操作强制执行此匹配,特别是在调用MethodHandle.invokeExact
和MethodHandle.invoke
期间,以及执行invokedynamic
指令期间。该结构是返回类型,伴随有任意数量的参数类型。 类型(原语,
void
和引用)由类
对象表示。 (为了便于说明,我们将void
视为一种类型。实际上,它表示没有返回类型。)MethodType
所有实例都是不可变的。 如果它们相等,则两个实例完全可互换。 平等取决于返回和参数类型的成对对应,而不是其他任何东西。此类型只能通过工厂方法创建。 尽管不保证缓存,但所有工厂方法都可以缓存值。 一些工厂方法是静态的,而其他工厂方法是修改前体方法类型的虚拟方法,例如,通过改变所选参数。
对参数类型组进行操作的工厂方法系统地以两个版本呈现,因此Java数组和Java列表都可用于处理参数类型组。 查询方法
parameterArray
和parameterList
还提供了数组和列表之间的选择。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
appendParameterTypes(类<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
appendParameterTypes(List<类<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
changeParameterType(int num, 类<?> nptype)
查找或创建具有单个不同参数类型的方法类型。MethodType
changeReturnType(类<?> nrtype)
查找或创建具有不同返回类型的方法类型。MethodType
dropParameterTypes(int start, int end)
查找或创建省略了某些参数类型的方法类型。boolean
equals(Object x)
将指定对象与此类型进行比较以获得相等性。MethodType
erase()
删除所有引用类型到Object
。static MethodType
fromMethodDescriptorString(String descriptor, ClassLoader loader)
在给定字节码描述符的拼写的情况下,查找或创建方法类型的实例。MethodType
generic()
将所有类型(包括引用和基元)转换为Object
。static MethodType
genericMethodType(int objectArgCount)
查找或创建其组件均为Object
的方法类型。static MethodType
genericMethodType(int objectArgCount, boolean finalArray)
查找或创建一个方法类型,其组件为Object
并带有可选的尾随Object[]
数组。int
hashCode()
返回此方法类型的哈希码值。boolean
hasPrimitives()
报告此类型是否包含基元参数或返回值。boolean
hasWrappers()
报告此类型是否包含包装器参数或返回值。MethodType
insertParameterTypes(int num, 类<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
insertParameterTypes(int num, List<类<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。类<?>
lastParameterType()
返回此方法类型的最后一个参数类型。static MethodType
methodType(类<?> rtype)
查找或创建具有给定组件的方法类型。static MethodType
methodType(类<?> rtype, 类<?> ptype0)
查找或创建具有给定组件的方法类型。static MethodType
methodType(类<?> rtype, 类<?>[] ptypes)
查找或创建给定方法类型的实例。static MethodType
methodType(类<?> rtype, 类<?> ptype0, 类<?>... ptypes)
查找或创建具有给定组件的方法类型。static MethodType
methodType(类<?> rtype, MethodType ptypes)
查找或创建具有给定组件的方法类型。static MethodType
methodType(类<?> rtype, List<类<?>> ptypes)
查找或创建具有给定组件的方法类型。类<?>[]
parameterArray()
将参数类型表示为数组(便捷方法)。int
parameterCount()
返回此方法类型中的参数类型数。List<类<?>>
parameterList()
将参数类型显示为列表(便捷方法)。类<?>
parameterType(int num)
返回此方法类型中指定索引处的参数类型。类<?>
returnType()
返回此方法类型的返回类型。String
toMethodDescriptorString()
生成方法类型的字节码描述符表示。String
toString()
返回方法类型的字符串表示形式,格式为"(PT0,PT1...)RT"
。MethodType
unwrap()
将所有包装器类型转换为其对应的基本类型。MethodType
wrap()
将所有基元类型转换为其对应的包装类型。
-
-
-
方法详细信息
-
methodType
public static MethodType methodType(类<?> rtype, 类<?>[] ptypes)
查找或创建给定方法类型的实例。- 参数
-
rtype
- 返回类型 -
ptypes
- 参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
-如果任何元件ptypes
是void.class
-
methodType
public static MethodType methodType(类<?> rtype, List<类<?>> ptypes)
查找或创建具有给定组件的方法类型。 便捷方法methodType
。- 参数
-
rtype
- 返回类型 -
ptypes
- 参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
-如果任何元件ptypes
是void.class
-
methodType
public static MethodType methodType(类<?> rtype, 类<?> ptype0, 类<?>... ptypes)
- 参数
-
rtype
- 返回类型 -
ptype0
- 第一个参数类型 -
ptypes
- 其余参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptype0
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
- 如果ptype0
或ptypes
或任何元素ptypes
是void.class
-
methodType
public static MethodType methodType(类<?> rtype)
- 参数
-
rtype
- 返回类型 - 结果
- 具有给定返回值的方法类型
- 异常
-
NullPointerException
- 如果rtype
为空
-
methodType
public static MethodType methodType(类<?> rtype, 类<?> ptype0)
- 参数
-
rtype
- 返回类型 -
ptype0
- 参数类型 - 结果
- 具有给定返回值和参数类型的方法类型
- 异常
-
NullPointerException
- 如果rtype
或ptype0
为空 -
IllegalArgumentException
- 如果ptype0
是void.class
-
methodType
public static MethodType methodType(类<?> rtype, MethodType ptypes)
- 参数
-
rtype
- 返回类型 -
ptypes
- 提供参数类型的方法类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
- 如果rtype
或ptypes
为空
-
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)
- 参数
-
objectArgCount
- 参数数量 - 结果
- 一种普遍适用的方法类型,用于给定参数计数的所有调用
- 异常
-
IllegalArgumentException
- 如果objectArgCount
为负数或大于255 - 另请参见:
-
genericMethodType(int, boolean)
-
changeParameterType
public MethodType changeParameterType(int num, 类<?> nptype)
查找或创建具有单个不同参数类型的方法类型。 便利方法methodType
。- 参数
-
num
- 要更改的参数类型的索引(从零开始) -
nptype
- 用于替换旧参数的新参数类型 - 结果
- 相同类型,但所选参数已更改
- 异常
-
IndexOutOfBoundsException
-如果num
不是有效的索引parameterArray()
-
IllegalArgumentException
- 如果nptype
是void.class
-
NullPointerException
- 如果nptype
为空
-
insertParameterTypes
public MethodType insertParameterTypes(int num, 类<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。 便捷方法methodType
。- 参数
-
num
- 插入的参数类型的位置(从零开始) -
ptypesToInsert
- 要插入参数列表的零个或多个新参数类型 - 结果
- 相同的类型,除了插入了所选参数
- 异常
-
IndexOutOfBoundsException
- 如果num
为负数或大于parameterCount()
-
IllegalArgumentException
-如果任何元件ptypesToInsert
是void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙 -
NullPointerException
- 如果ptypesToInsert
或其任何元素为null
-
appendParameterTypes
public MethodType appendParameterTypes(类<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。 便捷方法methodType
。- 参数
-
ptypesToInsert
- 在参数列表结束后插入零个或多个新参数类型 - 结果
- 相同的类型,除了附加的选定参数
- 异常
-
IllegalArgumentException
-如果任何元件ptypesToInsert
是void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙 -
NullPointerException
- 如果ptypesToInsert
或其任何元素为null
-
insertParameterTypes
public MethodType insertParameterTypes(int num, List<类<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。 便捷方法methodType
。- 参数
-
num
- 插入的参数类型的位置(从零开始) -
ptypesToInsert
- 要插入参数列表的零个或多个新参数类型 - 结果
- 相同的类型,除了插入了所选参数
- 异常
-
IndexOutOfBoundsException
- 如果num
为负数或大于parameterCount()
-
IllegalArgumentException
-如果任何元件ptypesToInsert
是void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙 -
NullPointerException
- 如果ptypesToInsert
或其任何元素为null
-
appendParameterTypes
public MethodType appendParameterTypes(List<类<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。 便捷方法methodType
。- 参数
-
ptypesToInsert
- 在参数列表结束后插入零个或多个新参数类型 - 结果
- 相同的类型,除了附加的选定参数
- 异常
-
IllegalArgumentException
-如果任何元件ptypesToInsert
是void.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()
- 结果
- 如果任何类型是包装器,则为true
-
erase
public MethodType erase()
- 结果
- 原始类型的版本,替换了所有引用类型
-
generic
public MethodType generic()
- 结果
- 替换所有类型的原始类型的版本
-
wrap
public MethodType wrap()
将所有基元类型转换为其对应的包装类型。 便利方法methodType
。 所有引用类型(包括包装类型)将保持不变。 Avoid
返回类型已更改为类型java.lang.Void
。 表达type.wrap().erase()
产生相同的值type.generic()
。- 结果
- 原始类型的一个版本,替换了所有基本类型
-
unwrap
public MethodType unwrap()
- 结果
- 原始类型的一个版本,替换了所有包装类型
-
parameterType
public 类<?> parameterType(int num)
返回此方法类型中指定索引处的参数类型。- 参数
-
num
- 所需参数类型的索引(从零开始) - 结果
- 选定的参数类型
- 异常
-
IndexOutOfBoundsException
-如果num
不是有效的索引parameterArray()
-
parameterCount
public int parameterCount()
返回此方法类型中的参数类型数。- 结果
- 参数类型的数量
-
returnType
public 类<?> returnType()
返回此方法类型的返回类型。- 结果
- 返回类型
-
lastParameterType
public 类<?> lastParameterType()
返回此方法类型的最后一个参数类型。 如果此类型没有参数,则返回void.class
值void.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()
-
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
,因为后者需要合适的类加载器参数。- 结果
- 字节码类型描述符表示
-
-