public final class MethodType extends Object implements Serializable
MethodHandle.invokeExact
和MethodHandle.invoke
的执行过程中,并invokedynamic
说明。
该结构是一个返回类型,伴随着任意数量的参数类型。 类型(原始, void
和参考)由类
对象表示。 (为了便于说明,我们将void
视为一种类型,实际上表示没有返回类型。)
的所有实例MethodType
是不可变的。 如果比较相等,则两个实例可以完全互换。 平等取决于返回值和参数类型的成对对应关系,而不取决于任何其他值。
此类型只能通过工厂方法创建。 所有工厂方法都可以缓存值,尽管不保证缓存。 一些工厂方法是静态的,而其他工厂方法是修改前体方法类型的虚拟方法,例如通过更改选定的参数。
以两个版本的方式系统地显示了对参数类型组进行操作的工厂方法,从而可以使用Java数组和Java列表来处理参数类型组。 查询方法parameterArray
和parameterList
还提供了数组和列表之间的选择。
MethodType
对象有时从诸如invokedynamic
字节码指令invokedynamic
,特别是从与类文件的常量池中的指令相关联的类型描述符字符串。
像类和字符串一样,方法类型也可以直接在类文件的常量池中表示为常量。 方法类型可以由ldc
指令加载,该ldc
是指适当的CONSTANT_MethodType
常量池条目。 该条目是针对描述符字符串的一个CONSTANT_Utf8
拼写。 (有关方法类型常量的详细信息,请参阅Java虚拟机规范的第4.4.8和5.4.3.5节。)
当JVM从描述符字符串中实现MethodType
时,描述符中命名的所有类都必须可访问,并将被加载。 (但是类不需要初始化,就像CONSTANT_Class
)。此加载可能会在MethodType
对象首次导出之前的任何时间发生。
Modifier and Type | Method and Description |
---|---|
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)
查找或创建具有其他参数类型的方法类型。
|
static MethodType |
methodType(类<?> rtype)
查找或创建具有给定组件的方法类型。
|
static MethodType |
methodType(类<?> rtype, 类<?> ptype0)
查找或创建具有给定组件的方法类型。
|
static MethodType |
methodType(类<?> rtype, 类<?>[] ptypes)
查找或创建给定方法类型的实例。
|
static MethodType |
methodType(类<?> rtype, 类<?> ptype0, 类<?>... ptypes)
查找或创建具有给定组件的方法类型。
|
static MethodType |
methodType(类<?> rtype, List<类<?>> ptypes)
查找或创建具有给定组件的方法类型。
|
static MethodType |
methodType(类<?> rtype, MethodType ptypes)
查找或创建具有给定组件的方法类型。
|
类<?>[] |
parameterArray()
将参数类型显示为数组(方便方法)。
|
int |
parameterCount()
返回此方法类型中的参数类型数。
|
List<类<?>> |
parameterList()
将参数类型显示为列表(方便方法)。
|
类<?> |
parameterType(int num)
在此方法类型中返回指定索引处的参数类型。
|
类<?> |
returnType()
返回此方法类型的返回类型。
|
String |
toMethodDescriptorString()
生成方法类型的字节码描述符表示。
|
String |
toString()
返回方法类型的字符串表示形式,格式为
"(PT0,PT1...)RT" 。
|
MethodType |
unwrap()
将所有包装类型转换为相应的原始类型。
|
MethodType |
wrap()
将所有原始类型转换为相应的包装类型。
|
public static MethodType methodType(类<?> rtype, 类<?>[] ptypes)
rtype
- 返回类型
ptypes
- 参数类型
NullPointerException
-如果
rtype
或
ptypes
或任何元件
ptypes
为空
IllegalArgumentException
-如果任何元件
ptypes
是
void.class
public static MethodType methodType(类<?> rtype, List<类<?>> ptypes)
methodType
。
rtype
- 返回类型
ptypes
- 参数类型
NullPointerException
-如果
rtype
或
ptypes
或任何元件
ptypes
为空
IllegalArgumentException
-如果任何元件
ptypes
是
void.class
public static MethodType methodType(类<?> rtype, 类<?> ptype0, 类<?>... ptypes)
rtype
- 返回类型
ptype0
- 第一个参数类型
ptypes
- 剩余的参数类型
NullPointerException
-如果
rtype
或
ptype0
或
ptypes
或任何元件
ptypes
为空
IllegalArgumentException
-如果
ptype0
或
ptypes
或任何元件
ptypes
是
void.class
public static MethodType methodType(类<?> rtype)
rtype
- 返回类型
NullPointerException
- 如果
rtype
为空
public static MethodType methodType(类<?> rtype, 类<?> ptype0)
rtype
- 返回类型
ptype0
- 参数类型
NullPointerException
- 如果
rtype
或
ptype0
为空
IllegalArgumentException
- 如果
ptype0
是
void.class
public static MethodType methodType(类<?> rtype, MethodType ptypes)
rtype
- 返回类型
ptypes
- 提供参数类型的方法类型
NullPointerException
- 如果
rtype
或
ptypes
为空
public static MethodType genericMethodType(int objectArgCount, boolean finalArray)
Object
,带有可选的尾随Object[]
阵列。
方便methodType
。
所有参数和返回类型将是Object
,除了最后的数组参数,如果有的话,这将是Object[]
。
objectArgCount
- 参数数(不包括最终数组参数(如果有))
finalArray
- 是否会有一个尾随数组参数,类型为
Object[]
IllegalArgumentException
- 如果
objectArgCount
为负数或大于255(或254,如果
finalArray
为真)
genericMethodType(int)
public static MethodType genericMethodType(int objectArgCount)
objectArgCount
- 参数数量
IllegalArgumentException
- 如果
objectArgCount
为负数或大于255
genericMethodType(int, boolean)
public MethodType changeParameterType(int num, 类<?> nptype)
methodType
。
num
- 要更改的参数类型的索引(从零开始)
nptype
- 用于替换旧参数的新参数类型
IndexOutOfBoundsException
-如果
num
不是有效的索引
parameterArray()
IllegalArgumentException
- 如果
nptype
是
void.class
NullPointerException
- 如果
nptype
为空
public MethodType insertParameterTypes(int num, 类<?>... ptypesToInsert)
methodType
。
num
- 插入的参数类型的位置(从零开始)
ptypesToInsert
- 要插入参数列表的零个或多个新参数类型
IndexOutOfBoundsException
- 如果
num
为负数或大于
parameterCount()
IllegalArgumentException
-如果任何元件
ptypesToInsert
是
void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙
NullPointerException
- 如果
ptypesToInsert
或其任何元素为空
public MethodType appendParameterTypes(类<?>... ptypesToInsert)
methodType
。
ptypesToInsert
- 在参数列表结束后插入的零个或多个新参数类型
IllegalArgumentException
-如果任何元件
ptypesToInsert
是
void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙
NullPointerException
- 如果
ptypesToInsert
或其任何元素为空
public MethodType insertParameterTypes(int num, List<类<?>> ptypesToInsert)
methodType
。
num
- 插入的参数类型的位置(从零开始)
ptypesToInsert
- 要插入参数列表的零个或多个新参数类型
IndexOutOfBoundsException
- 如果
num
为负数或大于
parameterCount()
IllegalArgumentException
-如果任何元件
ptypesToInsert
是
void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙
NullPointerException
- 如果
ptypesToInsert
或其任何元素为空
public MethodType appendParameterTypes(List<类<?>> ptypesToInsert)
methodType
。
ptypesToInsert
- 在参数列表结束后插入的零个或多个新参数类型
IllegalArgumentException
-如果任何元件
ptypesToInsert
是
void.class
,或者如果所产生的方法类型将具有255个以上的参数时隙
NullPointerException
- 如果
ptypesToInsert
或其任何元素为空
public MethodType dropParameterTypes(int start, int end)
methodType
。
start
- 要删除的第一个参数类型的索引(从零开始)
end
- 第一个参数类型的索引(大于
start
)不要删除
IndexOutOfBoundsException
- 如果
start
为负数或大于
parameterCount()
或
end
为负数或大于
parameterCount()
或
start
大于
end
public MethodType changeReturnType(类<?> nrtype)
methodType
。
nrtype
- 一个返回参数类型替换旧的
NullPointerException
- 如果
nrtype
为空
public boolean hasPrimitives()
void
计数为原始数据。
public boolean hasWrappers()
public MethodType erase()
public MethodType generic()
public MethodType wrap()
methodType
。
所有引用类型(包括包装类型)将保持不变。
A void
返回类型更改为java.lang.Void
。
表达type.wrap().erase()
产生相同的值type.generic()
。
public MethodType unwrap()
public 类<?> parameterType(int num)
num
- 所需参数类型的索引(从零开始)
IndexOutOfBoundsException
-如果
num
不是有效的索引
parameterArray()
public int parameterCount()
public 类<?> returnType()
public 类<?>[] parameterArray()
public boolean equals(Object x)
equals
在类别
Object
x
- 对象进行比较
true
如果此对象与obj参数相同;
false
否则。
Object.equals(Object)
public int hashCode()
hashCode
在类别
Object
Object.hashCode()
,
equals(Object)
,
List.hashCode()
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
- 如果找不到命名类型
public String toMethodDescriptorString()
请注意,这不是fromMethodDescriptorString
的严格倒数。 在描述符字符串中查看时,共享一个通用名称但具有不同类加载器的两个不同的类将显示相同。
包含这种方法是为了生成必须生成处理方法句柄和invokedynamic
。 fromMethodDescriptorString
,因为后者需要一个合适的类加载器参数。