- 所有已实现的接口:
-
Serializable,Constable,TypeDescriptor,TypeDescriptor.OfMethod<Class<?>,MethodType>
MethodHandle.invokeExact和MethodHandle.invoke以及执行invokedynamic指令时强制执行此匹配。
结构是一个返回类型和任意数量的参数类型。这些类型(原始类型、void和引用类型)由Class对象表示。(为了方便起见,我们将void视为一种类型。实际上,它表示没有返回类型。)
所有MethodType实例都是不可变的。如果它们相等,则两个实例完全可以互换。相等性取决于返回类型和参数类型的一一对应以及其他任何因素。
此类型只能通过工厂方法创建。所有工厂方法可能会缓存值,但不能保证缓存。一些工厂方法是静态的,而其他工厂方法是虚拟方法,可以修改前身方法类型,例如,通过更改所选参数。
操作参数类型组的工厂方法以两个版本系统地呈现,以便可以使用Java数组和Java列表来处理参数类型组。查询方法parameterArray和parameterList还提供了数组和列表之间的选择。
MethodType对象有时源自字节码指令,例如invokedynamic,具体来说是源自与类文件常量池中指令相关联的类型描述符字符串。
与类和字符串一样,方法类型也可以直接在类文件的常量池中表示为常量。方法类型可以通过引用适当的CONSTANT_MethodType常量池条目的ldc指令加载。该条目引用描述符字符串的CONSTANT_Utf8拼写。(有关方法类型常量的详细信息,请参见Java虚拟机规范的第4.4.8节和第5.4.3.5节。)
当JVM从描述符字符串实例化MethodType时,描述符中命名的所有类必须是可访问的,并将被加载。(但类不需要被初始化,就像CONSTANT_Class的情况一样。)此加载可能发生在首次派生MethodType对象之前的任何时间。
如果所有参数类型和返回类型都可以用nominal descriptor表示的ClassDesc描述,则可以用名义形式描述MethodType。如果方法类型可以被名义描述,则:
- 方法类型具有由
MethodType::describeConstable返回的nominal descriptor。 - 由方法类型的
MethodType::descriptorString或MethodType::toMethodDescriptorString返回的描述符字符串是方法描述符(JVMS 4.3.3)。
如果任何参数类型或返回类型无法被名义描述,即Class::describeConstable为该类型返回一个空的可选值,则该方法类型无法被名义描述:
- 方法类型没有
nominal descriptor,MethodType::describeConstable返回一个空的可选值。 - 由方法类型的
MethodType::descriptorString或MethodType::toMethodDescriptorString返回的描述符字符串不是类型描述符。
- 自版本:
- 1.7
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in interface java.lang.invoke.TypeDescriptor
TypeDescriptor.OfField<F extends TypeDescriptor.OfField<F>>, TypeDescriptor.OfMethod<F extends TypeDescriptor.OfField<F>,M extends TypeDescriptor.OfMethod<F, M>> -
Method Summary
Modifier and TypeMethodDescriptionappendParameterTypes(Class<?>... ptypesToInsert) 查找或创建具有额外参数类型的方法类型。appendParameterTypes(List<Class<?>> ptypesToInsert) 查找或创建具有额外参数类型的方法类型。changeParameterType(int num, Class<?> nptype) 查找或创建具有单个不同参数类型的方法类型。changeReturnType(Class<?> nrtype) 查找或创建具有不同返回类型的方法类型。返回此实例的名义描述符,如果可以构造一个,则返回一个空的Optional。返回此方法类型的描述符字符串。dropParameterTypes(int start, int end) 查找或创建省略了一些参数类型的方法类型。boolean将指定对象与此类型进行比较以检查是否相等。erase()擦除所有引用类型为Object。static MethodTypefromMethodDescriptorString(String descriptor, ClassLoader loader) 查找或创建给定方法描述符(JVMS 4.3.3)的方法类型的实例。generic()将所有类型(引用类型和原始类型)转换为Object。static MethodTypegenericMethodType(int objectArgCount) 查找或创建所有组件均为Object的方法类型。static MethodTypegenericMethodType(int objectArgCount, boolean finalArray) 查找或创建所有组件为Object且具有可选尾随Object[]数组的方法类型。inthashCode()返回此方法类型的哈希码值。boolean报告此类型是否包含原始参数或返回值。boolean报告此类型是否包含包装器参数或返回值。insertParameterTypes(int num, Class<?>... ptypesToInsert) 查找或创建具有额外参数类型的方法类型。insertParameterTypes(int num, List<Class<?>> ptypesToInsert) 查找或创建具有额外参数类型的方法类型。Class<?> 返回此方法类型的最后一个参数类型。static MethodTypemethodType(Class<?> rtype) 查找或创建具有给定组件的方法类型。static MethodTypemethodType(Class<?> rtype, Class<?> ptype0) 查找或创建具有给定组件的方法类型。static MethodTypemethodType(Class<?> rtype, Class<?>[] ptypes) 查找或创建给定方法类型的实例。static MethodTypemethodType(Class<?> rtype, Class<?> ptype0, Class<?>... ptypes) 查找或创建具有给定组件的方法类型。static MethodTypemethodType(Class<?> rtype, MethodType ptypes) 查找或创建具有给定组件的方法类型。static MethodTypemethodType(Class<?> rtype, List<Class<?>> ptypes) 查找或创建具有给定组件的方法类型。Class<?>[]将参数类型呈现为数组(一种便利方法)。int返回此方法类型中参数类型的数量。将参数类型呈现为列表(一种便利方法)。Class<?> parameterType(int num) 返回此方法类型中指定索引处的参数类型。Class<?> 返回此方法类型的返回类型。返回此方法类型的描述符字符串。toString()返回方法类型的字符串表示形式,形式为"(PT0,PT1...)RT"。unwrap()将所有包装器类型转换为相应的原始类型。wrap()将所有原始类型转换为相应的包装器类型。
-
Method Details
-
methodType
查找或创建给定方法类型的实例。- 参数:
-
rtype- 返回类型 -
ptypes- 参数类型 - 返回:
- 具有给定组件的方法类型
- 抛出:
-
NullPointerException- 如果rtype或ptypes或ptypes的任何元素为null -
IllegalArgumentException- 如果ptypes的任何元素为void.class
-
methodType
查找或创建具有给定组件的方法类型。便利方法为methodType。- 参数:
-
rtype- 返回类型 -
ptypes- 参数类型 - 返回:
- 具有给定组件的方法类型
- 抛出:
-
NullPointerException- 如果rtype或ptypes或ptypes的任何元素为null -
IllegalArgumentException- 如果ptypes的任何元素为void.class
-
methodType
查找或创建具有给定组件的方法类型。便利方法为methodType。前导参数类型将添加到其余数组中。- 参数:
-
rtype- 返回类型 -
ptype0- 第一个参数类型 -
ptypes- 剩余的参数类型 - 返回:
- 具有给定组件的方法类型
- 抛出:
-
NullPointerException- 如果rtype或ptype0或ptypes或ptypes的任何元素为null -
IllegalArgumentException- 如果ptype0或ptypes或ptypes的任何元素为void.class
-
methodType
找到或创建具有给定组件的方法类型。方便方法为methodType。结果方法没有参数类型。- 参数:
-
rtype- 返回类型 - 返回:
- 具有给定返回值的方法类型
- 抛出:
-
NullPointerException- 如果rtype为null
-
methodType
找到或创建具有给定组件的方法类型。方便方法为methodType。结果方法具有单个给定的参数类型。- 参数:
-
rtype- 返回类型 -
ptype0- 参数类型 - 返回:
- 具有给定返回值和参数类型的方法类型
- 抛出:
-
NullPointerException- 如果rtype或ptype0为null -
IllegalArgumentException- 如果ptype0为void.class
-
methodType
找到或创建具有给定组件的方法类型。方便方法为methodType。结果方法具有与ptypes相同的参数类型,并指定的返回类型。- 参数:
-
rtype- 返回类型 -
ptypes- 提供参数类型的方法类型 - 返回:
- 具有给定组件的方法类型
- 抛出:
-
NullPointerException- 如果rtype或ptypes为null
-
genericMethodType
找到或创建其组件为Object的方法类型,带有可选的尾随Object[]数组。方便方法为methodType。所有参数和返回类型将为Object,除非有最终数组参数(如果有的话),那将为Object[]。- 参数:
-
objectArgCount- 参数数量(不包括最终数组参数) -
finalArray- 是否会有一个尾随的数组参数,类型为Object[] - 返回:
- 一个通用适用的方法类型,适用于给定固定参数数量的所有调用和进一步参数的收集数组
- 抛出:
-
IllegalArgumentException- 如果objectArgCount为负数或大于255(如果finalArray为true,则为254) - 参见:
-
genericMethodType
找到或创建其组件全部为Object的方法类型。方便方法为methodType。所有参数和返回类型将为Object。- 参数:
-
objectArgCount- 参数数量 - 返回:
- 一个通用适用的方法类型,适用于给定参数数量的所有调用
- 抛出:
-
IllegalArgumentException- 如果objectArgCount为负数或大于255 - 参见:
-
changeParameterType
找到或创建具有单个不同参数类型的方法类型。方便方法为methodType。- 指定者:
-
changeParameterType在接口TypeDescriptor.OfMethod<Class<?>,MethodType> - 参数:
-
num- 要更改的参数类型的索引(从零开始) -
nptype- 要用新参数类型替换旧参数类型的新参数类型 - 返回:
- 相同类型,除了所选参数已更改
- 抛出:
-
IndexOutOfBoundsException- 如果num不是有效的索引进入parameterArray() -
IllegalArgumentException- 如果nptype为void.class -
NullPointerException- 如果nptype为null
-
insertParameterTypes
找到或创建具有额外参数类型的方法类型。方便方法为methodType。- 指定者:
-
insertParameterTypes在接口TypeDescriptor.OfMethod<Class<?>,MethodType> - 参数:
-
num- 要插入的参数类型的位置(从零开始) -
ptypesToInsert- 要插入到参数列表中的零个或多个新参数类型 - 返回:
- 相同类型,除了所选参数已插入
- 抛出:
-
IndexOutOfBoundsException- 如果num为负数或大于parameterCount() -
IllegalArgumentException- 如果ptypesToInsert的任何元素为void.class或者如果结果方法类型将具有超过255个参数槽 -
NullPointerException- 如果ptypesToInsert或其任何元素为null
-
appendParameterTypes
找到或创建具有额外参数类型的方法类型。方便方法为methodType。- 参数:
-
ptypesToInsert- 要在参数列表末尾之后插入的零个或多个新参数类型 - 返回:
- 相同类型,除了所选参数已附加
- 抛出:
-
IllegalArgumentException- 如果ptypesToInsert的任何元素为void.class或者如果结果方法类型将具有超过255个参数槽 -
NullPointerException- 如果ptypesToInsert或其任何元素为null
-
insertParameterTypes
找到或创建具有省略某些参数类型的方法类型。方便方法为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- ifnumis negative or greater thanparameterCount() -
IllegalArgumentException- if any element ofptypesToInsertisvoid.classor if the resulting method type would have more than 255 parameter slots -
NullPointerException- ifptypesToInsertor any of its elements is null
-
appendParameterTypes
Finds or creates a method type with additional parameter types. Convenience method formethodType.- 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 ofptypesToInsertisvoid.classor if the resulting method type would have more than 255 parameter slots -
NullPointerException- ifptypesToInsertor any of its elements is null
-
dropParameterTypes
Finds or creates a method type with some parameter types omitted. Convenience method formethodType.- 指定者:
-
dropParameterTypes在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 参数:
-
start- 要移除的第一个参数类型的索引(从零开始) -
end- 不要移除的第一个参数类型之后的索引(大于start) - 返回:
- 相同的类型,除了已选择的参数被移除
- 抛出:
-
IndexOutOfBoundsException- 如果start为负数或大于parameterCount(),或者如果end为负数或大于parameterCount(),或者如果start大于end
-
changeReturnType
找到或创建具有不同返回类型的方法类型。方便方法为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
- 返回:
- 具有所有引用类型替换的原始类型的版本
-
generic
- 返回:
- 具有所有类型替换的原始类型的版本
-
wrap
将所有原始类型转换为其对应的包装器类型。方便方法为methodType。所有引用类型(包括包装器类型)将保持不变。返回类型void将更改为类型java.lang.Void。表达式type.wrap().erase()产生与type.generic()相同的值。- 返回:
- 具有所有包装器类型替换的原始类型的版本
-
unwrap
- 返回:
- 具有所有包装器类型替换的原始类型的版本
-
parameterType
返回此方法类型中指定索引处的参数类型。- 指定者:
-
parameterType在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 参数:
-
num- 所需参数类型的索引(从零开始) - 返回:
- 所选参数类型
- 抛出:
-
IndexOutOfBoundsException- 如果num不是parameterArray()的有效索引
-
parameterCount
public int parameterCount()返回此方法类型中的参数类型数。- 指定者:
-
parameterCount在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 返回:
- 参数类型数
-
returnType
返回此方法类型的返回类型。- 指定者:
-
returnType在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 返回:
- 返回类型
-
parameterList
将参数类型呈现为列表(方便方法)。列表将是不可变的。- 指定者:
-
parameterList在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 返回:
- 参数类型(作为不可变列表)
-
lastParameterType
返回此方法类型的最后一个参数类型。如果此类型没有参数,则返回标记值void.class。- API注释:
-
选择标记值是为了可以直接针对结果值进行反射查询。选择标记值不会与真实参数混淆,因为
void永远不可接受作为参数类型。对于可变数量的调用模式,表达式lastParameterType().getComponentType()对于查询“可变参数”参数的类型很有用。 - 返回:
-
如果有的话,则返回最后一个参数类型,否则返回
void.class - 自:
- 10
-
parameterArray
将参数类型呈现为数组(方便方法)。对数组的更改不会导致类型的更改。- 指定者:
-
parameterArray在接口TypeDescriptor.OfMethod<Class<?>,中MethodType> - 返回:
- 参数类型(如有必要,作为新副本)
-
equals
将指定的对象与此类型进行比较以确定是否相等。也就是说,仅当指定的对象也是具有完全相同参数和返回类型的方法类型时,它才返回true。 -
hashCode
public int hashCode()返回此方法类型的哈希码值。它被定义为具有返回类型后跟参数类型的列表的哈希码的相同值。 -
toString
返回方法类型的字符串表示形式,形式为"(PT0,PT1...)RT"。方法类型的字符串表示形式是由括号括起来的、逗号分隔的类型名称列表,紧接着是返回类型。每种类型由其
简单名称表示。 -
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- 如果存在安全管理器且loader为null且调用者没有RuntimePermission("getClassLoader") - 参见 Java虚拟机规范:
-
4.3.3 方法描述符
-
toMethodDescriptorString
返回此方法类型的描述符字符串。此方法等效于调用MethodType::descriptorString。- API 注意:
-
这不是
fromMethodDescriptorString的严格反函数,后者需要方法类型描述符(JVMS 4.3.3)和适当的类加载器参数。两个不同的MethodType对象可以具有相同的描述符字符串,因为不同的类可以具有相同的名称但不同的类加载器。此方法包含在必须生成处理方法句柄和
invokedynamic的字节码的应用程序的利益。 - 返回:
- 此方法类型的描述符字符串
- 参见 Java虚拟机规范:
-
4.3.3 方法描述符
- 另请参阅:
-
descriptorString
返回此方法类型的描述符字符串。如果此方法类型可以被名义描述,则结果是一个方法类型描述符(JVMS 4.3.3)。可以通过使用结果描述符字符串调用
MethodTypeDesc::ofDescriptor来生成此方法类型的MethodTypeDesc。如果此方法类型无法被名义描述,且结果是以下形式的字符串:
其中"(<parameter-descriptors>)<return-descriptor>"<parameter-descriptors>是所有参数类型的描述符字符串和返回类型的描述符字符串的连接。无法从结果字符串生成MethodTypeDesc。- 指定者:
-
descriptorString在接口TypeDescriptor - 返回:
- 此方法类型的描述符字符串
- 参见 Java虚拟机规范:
-
4.3.3 方法描述符
- 自:
- 12
- 另请参阅:
-
describeConstable
返回此实例的名义描述,如果可以构造,则返回一个空的Optional。- 指定者:
-
describeConstable在接口Constable - 返回:
-
包含生成的名义描述的
Optional,如果无法构造,则返回一个空的Optional。 - 自:
- 12
- 另请参阅:
-