- java.lang.Object
-
- java.lang.invoke.MethodType
-
- All Implemented Interfaces:
-
Serializable
public final class MethodType extends Object implements Serializable
方法类型表示方法句柄接受和返回的参数和返回类型,或方法句柄调用者传递和预期的参数和返回类型。 方法类型必须在方法句柄和其所有调用者之间进行正确匹配,并且JVM的操作在执行MethodHandle.invokeExact
和MethodHandle.invoke
以及在执行invokedynamic
指令期间执行此匹配。该结构是一个返回类型,伴随着任意数量的参数类型。 类型(原始,
void
和参考)由Class
对象表示。 (为了便于说明,我们把void
看成是一个类型,实际上它表示没有返回类型。)MethodType
所有实例都是不可变的。 如果比较相等,则两个实例可以完全互换。 平等取决于返回值和参数类型的成对对应关系,而不取决于任何其他值。此类型只能通过工厂方法创建。 所有工厂方法都可以缓存值,尽管不能保证缓存。 一些工厂方法是静态的,而其他工厂方法是修改前体方法类型的虚拟方法,例如通过更改选定的参数。
以两个版本的方式系统地显示了对参数类型组进行操作的工厂方法,从而可以使用Java数组和Java列表来处理参数类型组。 查询方法
parameterArray
和parameterList
还提供了数组和列表之间的选择。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
-
-
方法摘要
所有方法 静态方法 接口方法 具体的方法 Modifier and Type 方法 描述 MethodType
appendParameterTypes(Class<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
appendParameterTypes(List<Class<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
changeParameterType(int num, Class<?> nptype)
查找或创建具有单个不同参数类型的方法类型。MethodType
changeReturnType(Class<?> 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, Class<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。MethodType
insertParameterTypes(int num, List<Class<?>> ptypesToInsert)
查找或创建具有其他参数类型的方法类型。static MethodType
methodType(Class<?> rtype)
查找或创建具有给定组件的方法类型。static MethodType
methodType(Class<?> rtype, Class<?> ptype0)
查找或创建具有给定组件的方法类型。static MethodType
methodType(Class<?> rtype, Class<?>[] ptypes)
查找或创建给定方法类型的实例。static MethodType
methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
查找或创建具有给定组件的方法类型。static MethodType
methodType(Class<?> rtype, MethodType ptypes)
查找或创建具有给定组件的方法类型。static MethodType
methodType(Class<?> rtype, List<Class<?>> ptypes)
查找或创建具有给定组件的方法类型。Class<?>[]
parameterArray()
将参数类型显示为数组(方便方法)。int
parameterCount()
返回此方法类型中的参数类型数。List<Class<?>>
parameterList()
将参数类型显示为列表(方便方法)。Class<?>
parameterType(int num)
在此方法类型中返回指定索引处的参数类型。Class<?>
returnType()
返回此方法类型的返回类型。String
toMethodDescriptorString()
生成方法类型的字节码描述符表示。String
toString()
返回方法类型的字符串表示形式,格式为"(PT0,PT1...)RT"
。MethodType
unwrap()
将所有包装类型转换为相应的原始类型。MethodType
wrap()
将所有原始类型转换为相应的包装类型。
-
-
-
方法详细信息
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?>[] ptypes)
查找或创建给定方法类型的实例。- 参数
-
rtype
- 返回类型 -
ptypes
- 参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
-如果任何元件ptypes
是void.class
-
methodType
public static MethodType methodType(Class<?> rtype, List<Class<?>> ptypes)
查找或创建具有给定组件的方法类型。 方便methodType
。- 参数
-
rtype
- 返回类型 -
ptypes
- 参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
-如果任何元件ptypes
是void.class
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes)
- 参数
-
rtype
- 返回类型 -
ptype0
- 第一个参数类型 -
ptypes
- 剩余的参数类型 - 结果
- 具有给定组件的方法类型
- 异常
-
NullPointerException
-如果rtype
或ptype0
或ptypes
或任何元件ptypes
为空 -
IllegalArgumentException
-如果ptype0
或ptypes
或任何元件ptypes
是void.class
-
methodType
public static MethodType methodType(Class<?> rtype)
- 参数
-
rtype
- 返回类型 - 结果
- 具有给定返回值的方法类型
- 异常
-
NullPointerException
- 如果rtype
为空
-
methodType
public static MethodType methodType(Class<?> rtype, Class<?> ptype0)
- 参数
-
rtype
- 返回类型 -
ptype0
- 参数类型 - 结果
- 具有给定返回值和参数类型的方法类型
- 异常
-
NullPointerException
- 如果rtype
或ptype0
为空 -
IllegalArgumentException
- 如果ptype0
是void.class
-
methodType
public static MethodType methodType(Class<?> 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, Class<?> nptype)
查找或创建具有单个不同参数类型的方法类型。 方便methodType
。- 参数
-
num
- 要更改的参数类型的索引(从零开始) -
nptype
- 用于替换旧参数的新参数类型 - 结果
- 相同类型,除了所选参数更改
- 异常
-
IndexOutOfBoundsException
- 如果num
不是有效的索引到parameterArray()
-
IllegalArgumentException
- 如果nptype
是void.class
-
NullPointerException
- 如果nptype
为空
-
insertParameterTypes
public MethodType insertParameterTypes(int num, Class<?>... ptypesToInsert)
查找或创建具有其他参数类型的方法类型。 方便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
的方便方法。- 参数
-
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()
- 结果
- 如果任何类型是包装器,则为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 Class<?> parameterType(int num)
在此方法类型中返回指定索引处的参数类型。- 参数
-
num
- 所需参数类型的索引(从零开始) - 结果
- 所选参数类型
- 异常
-
IndexOutOfBoundsException
- 如果num
不是有效的索引到parameterArray()
-
parameterCount
public int parameterCount()
返回此方法类型中的参数类型数。- 结果
- 参数类型的数量
-
returnType
public Class<?> returnType()
返回此方法类型的返回类型。- 结果
- 返回类型
-
parameterArray
public Class<?>[] parameterArray()
将参数类型显示为数组(方便方法)。 对数组的更改不会导致类型的更改。- 结果
- 参数类型(如有必要,作为新的副本)
-
equals
public boolean equals(Object x)
将指定的对象与此类型进行比较以获得相等性。 也就是说,当且仅当指定的对象也是具有完全相同的参数和返回类型的方法类型时,它返回true
。- 重写:
-
equals
在Object
- 参数
-
x
- 对象进行比较 - 结果
-
true
如果此对象与obj参数相同; 否则为false
。 - 另请参见:
-
Object.equals(Object)
-
hashCode
public int hashCode()
返回此方法类型的哈希码值。 它被定义为与列表的哈希码相同,其元素是返回类型,后跟参数类型。- 重写:
-
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
- 如果字符串为空 -
IllegalArgumentException
- 如果字符串格式不正确 -
TypeNotPresentException
- 如果找不到命名类型
-
toMethodDescriptorString
public String toMethodDescriptorString()
生成方法类型的字节码描述符表示。请注意,这不是
fromMethodDescriptorString
的严格倒数。 在描述符字符串中查看时,共享一个通用名称但具有不同类加载器的两个不同的类将显示相同。包括这种方法是为了生成必须生成处理方法句柄和
invokedynamic
字节码的应用程序。fromMethodDescriptorString
,因为后者需要一个合适的类加载器参数。- 结果
- 字节码类型描述符表示
-
-