- 所有已实现的接口:
-
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 MethodType
fromMethodDescriptorString
(String descriptor, ClassLoader loader) 查找或创建给定方法描述符(JVMS 4.3.3)的方法类型的实例。generic()
将所有类型(引用类型和原始类型)转换为Object
。static MethodType
genericMethodType
(int objectArgCount) 查找或创建所有组件均为Object
的方法类型。static MethodType
genericMethodType
(int objectArgCount, boolean finalArray) 查找或创建所有组件为Object
且具有可选尾随Object[]
数组的方法类型。int
hashCode()
返回此方法类型的哈希码值。boolean
报告此类型是否包含原始参数或返回值。boolean
报告此类型是否包含包装器参数或返回值。insertParameterTypes
(int num, Class<?>... ptypesToInsert) 查找或创建具有额外参数类型的方法类型。insertParameterTypes
(int num, List<Class<?>> ptypesToInsert) 查找或创建具有额外参数类型的方法类型。Class
<?> 返回此方法类型的最后一个参数类型。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<?>[]
将参数类型呈现为数组(一种便利方法)。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
- ifnum
is negative or greater thanparameterCount()
-
IllegalArgumentException
- if any element ofptypesToInsert
isvoid.class
or if the resulting method type would have more than 255 parameter slots -
NullPointerException
- ifptypesToInsert
or 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 ofptypesToInsert
isvoid.class
or if the resulting method type would have more than 255 parameter slots -
NullPointerException
- ifptypesToInsert
or 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
- 另请参阅:
-