- 所有已实现的接口:
Serializable
,Constable
,TypeDescriptor
,TypeDescriptor.OfMethod<Class<?>,
MethodType>
MethodHandle.invokeExact
和 MethodHandle.invoke
期间,以及在执行 invokedynamic
指令期间。
该结构是一个返回类型,伴随着任意数量的参数类型。类型(原始、void
和引用)由 Class
对象表示。 (为了便于说明,我们将 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
对象首次派生之前的任何时间。
当且仅当所有参数类型和返回类型都可以用 ClassDesc
表示的 nominal descriptor
描述时, MethodType
才能在 名义形式 中描述。如果可以名义上描述方法类型,则:
- 方法类型有一个
nominal descriptor
由MethodType::describeConstable
返回。 MethodType::descriptorString
或MethodType::toMethodDescriptorString
为方法类型返回的描述符字符串是方法描述符 (JVMS 4.3.3)。
如果无法名义上描述任何参数类型或返回类型,即 Class::describeConstable
返回该类型的空可选,则无法名义上描述方法类型:
- 方法类型没有
nominal descriptor
和MethodType::describeConstable
返回一个空的可选。 MethodType::descriptorString
或MethodType::toMethodDescriptorString
为方法类型返回的描述符字符串不是类型描述符。
- 自从:
- 1.7
- 参见:
-
内部类总结
在接口 java.lang.invoke.TypeDescriptor 中声明的嵌套类/接口
TypeDescriptor.OfField<F extends TypeDescriptor.OfField<F>>, TypeDescriptor.OfMethod<F extends TypeDescriptor.OfField<F>,
M extends TypeDescriptor.OfMethod<F, M>> -
方法总结
修饰符和类型方法描述appendParameterTypes
(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) 给定字节码描述符的拼写,查找或创建方法类型的实例。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()
将所有原始类型转换为其相应的包装器类型。
-
方法详情
-
methodType
查找或创建给定方法类型的实例。- 参数:
rtype
- 返回类型ptypes
- 参数类型- 返回:
- 具有给定组件的方法类型
- 抛出:
NullPointerException
- 如果rtype
或ptypes
或ptypes
的任何元素为空IllegalArgumentException
- 如果ptypes
的任何元素是void.class
-
methodType
查找或创建具有给定组件的方法类型。methodType
的便捷方法。- 参数:
rtype
- 返回类型ptypes
- 参数类型- 返回:
- 具有给定组件的方法类型
- 抛出:
NullPointerException
- 如果rtype
或ptypes
或ptypes
的任何元素为空IllegalArgumentException
- 如果ptypes
的任何元素是void.class
-
methodType
查找或创建具有给定组件的方法类型。methodType
的便捷方法。前导参数类型被添加到剩余数组的前面。- 参数:
rtype
- 返回类型ptype0
- 第一个参数类型ptypes
- 其余参数类型- 返回:
- 具有给定组件的方法类型
- 抛出:
NullPointerException
- 如果rtype
或ptype0
或ptypes
或ptypes
的任何元素为空IllegalArgumentException
- 如果ptype0
或ptypes
或ptypes
的任何元素是void.class
-
methodType
查找或创建具有给定组件的方法类型。methodType
的便捷方法。结果方法没有参数类型。- 参数:
rtype
- 返回类型- 返回:
- 具有给定返回值的方法类型
- 抛出:
NullPointerException
- 如果rtype
为空
-
methodType
查找或创建具有给定组件的方法类型。methodType
的便捷方法。生成的方法具有单一的给定参数类型。- 参数:
rtype
- 返回类型ptype0
- 参数类型- 返回:
- 具有给定返回值和参数类型的方法类型
- 抛出:
NullPointerException
- 如果rtype
或ptype0
为空IllegalArgumentException
- 如果ptype0
是void.class
-
methodType
查找或创建具有给定组件的方法类型。methodType
的便捷方法。生成的方法具有与ptypes
相同的参数类型和指定的返回类型。- 参数:
rtype
- 返回类型ptypes
- 提供参数类型的方法类型- 返回:
- 具有给定组件的方法类型
- 抛出:
NullPointerException
- 如果rtype
或ptypes
为空
-
genericMethodType
查找或创建一个方法类型,其组件是Object
和一个可选的尾随Object[]
数组。methodType
的便捷方法。所有参数和返回类型都将是Object
,除了最后的数组参数(如果有的话),它将是Object[]
。- 参数:
objectArgCount
- 参数数量(不包括最终数组参数,如果有的话)finalArray
- 是否会有Object[]
类型的尾随数组参数- 返回:
- 一种普遍适用的方法类型,用于给定固定参数计数的所有调用和收集的进一步参数数组
- 抛出:
IllegalArgumentException
- 如果objectArgCount
为负或大于 255(或 254,如果finalArray
为真)- 参见:
-
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
为空
-
insertParameterTypes
查找或创建具有附加参数类型的方法类型。methodType
的便捷方法。- 指定者:
insertParameterTypes
在接口TypeDescriptor.OfMethod<Class<?>,
中MethodType> - 参数:
num
- 插入的参数类型的位置(从零开始)ptypesToInsert
- 要插入参数列表的零个或多个新参数类型- 返回:
- 相同的类型,除了插入了选定的参数
- 抛出:
IndexOutOfBoundsException
- 如果num
为负或大于parameterCount()
IllegalArgumentException
- 如果ptypesToInsert
的任何元素是void.class
或者生成的方法类型将具有超过 255 个参数槽NullPointerException
- 如果ptypesToInsert
或其任何元素为空
-
appendParameterTypes
查找或创建具有附加参数类型的方法类型。methodType
的便捷方法。- 参数:
ptypesToInsert
- 在参数列表末尾后插入零个或多个新参数类型- 返回:
- 相同的类型,除了附加了选定的参数
- 抛出:
IllegalArgumentException
- 如果ptypesToInsert
的任何元素是void.class
或者生成的方法类型将具有超过 255 个参数槽NullPointerException
- 如果ptypesToInsert
或其任何元素为空
-
insertParameterTypes
查找或创建具有附加参数类型的方法类型。methodType
的便捷方法。- 参数:
num
- 插入的参数类型的位置(从零开始)ptypesToInsert
- 要插入参数列表的零个或多个新参数类型- 返回:
- 相同的类型,除了插入了选定的参数
- 抛出:
IndexOutOfBoundsException
- 如果num
为负或大于parameterCount()
IllegalArgumentException
- 如果ptypesToInsert
的任何元素是void.class
或者生成的方法类型将具有超过 255 个参数槽NullPointerException
- 如果ptypesToInsert
或其任何元素为空
-
appendParameterTypes
查找或创建具有附加参数类型的方法类型。methodType
的便捷方法。- 参数:
ptypesToInsert
- 在参数列表末尾后插入零个或多个新参数类型- 返回:
- 相同的类型,除了附加了选定的参数
- 抛出:
IllegalArgumentException
- 如果ptypesToInsert
的任何元素是void.class
或者生成的方法类型将具有超过 255 个参数槽NullPointerException
- 如果ptypesToInsert
或其任何元素为空
-
dropParameterTypes
查找或创建省略了某些参数类型的方法类型。methodType
的便捷方法。- 指定者:
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
为空
-
hasPrimitives
public boolean hasPrimitives()报告此类型是否包含原始参数或返回值。返回类型void
算作原始类型。- 返回:
- 如果任何类型是原始类型,则为真
-
hasWrappers
public boolean hasWrappers()报告此类型是否包含包装器参数或返回值。包装器是包装原始值的类型,例如Integer
。如果引用类型java.lang.Void
作为返回类型出现,则它算作包装器。- 返回:
- 如果任何类型是包装器则为真
-
erase
- 返回:
- 替换了所有引用类型的原始类型的版本
-
generic
将所有类型(包括引用和原始类型)转换为Object
。genericMethodType
的便捷方法。表达式type.wrap().erase()
产生与type.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()
可用于查询“varargs”参数的类型。 - 返回:
-
最后一个参数类型(如果有),否则为
void.class
- 自从:
- 10
-
parameterArray
将参数类型呈现为数组(一种便捷方法)。对数组的更改不会导致类型发生更改。- 指定者:
parameterArray
在接口TypeDescriptor.OfMethod<Class<?>,
中MethodType> - 返回:
- 参数类型(如有必要,作为新副本)
-
equals
比较指定对象与此类型是否相等。也就是说,当且仅当指定的对象也是具有完全相同的参数和返回类型的方法类型时,它才返回true
。 -
hashCode
public int hashCode()返回此方法类型的哈希码值。它被定义为与 List 的哈希码相同,List 的元素是返回类型,后跟参数类型。 -
toString
返回方法类型的字符串表示形式,形式为"(PT0,PT1...)RT"
。方法类型的字符串表示形式是用括号括起来、逗号分隔的类型名称列表,紧跟在返回类型之后。每种类型都由其
simple name
表示。 -
fromMethodDescriptorString
public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException , TypeNotPresentException 给定字节码描述符的拼写,查找或创建方法类型的实例。methodType
的便捷方法。描述符字符串中嵌入的任何类或接口名称都将由给定的加载器解析(或者如果它为空,则在系统类加载器上解析)。请注意,可能会遇到无法通过此方法构造的方法类型,因为它们的组件类型并非都可以从公共类加载器访问。
包含此方法是为了使必须生成处理方法句柄和
invokedynamic
的字节码的应用程序受益。- 参数:
descriptor
- 字节码级类型描述符字符串“(T...)T”loader
- 在其中查找类型的类加载器- 返回:
- 匹配字节码级类型描述符的方法类型
- 抛出:
NullPointerException
- 如果字符串为空IllegalArgumentException
- 如果字符串格式不正确TypeNotPresentException
- 如果找不到命名类型SecurityException
- 如果安全管理器存在且loader
是null
并且调用者没有RuntimePermission
("getClassLoader")
-
toMethodDescriptorString
返回方法类型的描述符字符串。此方法相当于调用MethodType::descriptorString
。请注意,这不是
fromMethodDescriptorString
的严格逆。当在描述符字符串中查看时,共享共同名称但具有不同类加载器的两个不同类将看起来相同。包含此方法是为了使必须生成处理方法句柄和
invokedynamic
的字节码的应用程序受益。fromMethodDescriptorString
,因为后者需要合适的类加载器参数。- 返回:
- 此方法类型的描述符字符串
- 看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
- 参见:
-