public final class MethodType extends Object implements Serializable
MethodHandle.invokeExact和
MethodHandle.invoke,在
invokedynamic指令的执行。
该结构是伴随着任意数量的参数类型的返回类型。类型(原始的,void,参考)是由类物体的代表。(为了叙述方便,我们把void好像是一型。事实上,它表示一个返回类型的情况下。
MethodType所有实例是不可变的。如果两个实例比较相等,则是完全可以互换的。等式依赖于返回和参数类型的成对对应关系,而没有依赖于其他类型的对应关系。
这种类型只能通过工厂方法来创建。所有工厂方法可能缓存值,但不保证缓存。一些工厂方法是静态的,而其他的是虚拟的方法,修改前体的方法类型,例如,通过改变一个选定的参数。
有两种版本系统介绍了工厂方法操作上的参数类型组,使java数组和java列表可以用来与参数类型组的工作。查询方法parameterArray和parameterList也提供了数组和列表之间的选择。
MethodType对象有时是从字节码指令如invokedynamic,专门从类文件中的常量池指令相关联的类型说明符字符串。
像类和字符串一样,方法类型也可以直接表示在一个类文件的常量池中作为常量。一种类型可以由ldc指令指的是一个合适的CONSTANT_MethodType常量池入口装。入口是一种描述符字符串CONSTANT_Utf8拼写。(全部细节的方法类型常数,见第4.4.8和5.4.3.5的java虚拟机的规范。)
当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任何元素为null
IllegalArgumentException -如果
ptypes任何元素
void.class
public static MethodType methodType(类<?> rtype, List<类<?>> ptypes)
methodType便利的方法。
rtype的返回类型
ptypes的参数类型
NullPointerException -如果
rtype或
ptypes或
ptypes任何元素为null
IllegalArgumentException -如果
ptypes任何元素
void.class
public static MethodType methodType(类<?> rtype, 类<?> ptype0, 类<?>... ptypes)
methodType便利的方法。主要参数类型前面剩余的阵列。
rtype的返回类型
ptype0 -第一个参数类型
ptypes -其余的参数类型
NullPointerException -如果
rtype或
ptype0或
ptypes或
ptypes任何元素为null
IllegalArgumentException -如果
ptype0或
ptypes或任何元素
void.class
ptypes
public static MethodType methodType(类<?> rtype)
methodType便利方法。该方法没有参数类型。
rtype的返回类型
NullPointerException -如果
rtype是空的
public static MethodType methodType(类<?> rtype, 类<?> ptype0)
methodType便利的方法。该方法具有单一参数类型。
rtype的返回类型
ptype0 -参数类型
NullPointerException -如果
rtype或
ptype0是空的
void.class
ptype0
IllegalArgumentException
public static MethodType methodType(类<?> rtype, MethodType ptypes)
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)
Object。方便的方法
methodType。所有参数和返回类型将被对象。
objectArgCount数参数
IllegalArgumentException -如果
objectArgCount为负数或大于255
genericMethodType(int, boolean)
public MethodType changeParameterType(int num, 类<?> nptype)
methodType便利的方法。
num -索引(从零开始)的参数类型改变
nptype -一个新的参数类型来取代旧的一
IndexOutOfBoundsException -如果
num不是有效的指标为
parameterArray()
void.class
nptype
IllegalArgumentException
NullPointerException -如果
nptype是空的
public MethodType insertParameterTypes(int num, 类<?>... ptypesToInsert)
methodType便利的方法。
num -位置(零基础)的插入参数类型(S)
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 -位置(零基础)的插入参数类型(S)
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()
Integer。引用类型
java.lang.Void计数作为包装,如果它是一个返回类型。
public MethodType erase()
public MethodType generic()
public MethodType wrap()
methodType便利方法。所有引用类型(包括包装类型)将保持不变。一个
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 String toString()
"(PT0,PT1...)RT"。一个方法类型的字符串表示形式是一个括号封闭,以逗号分隔的类型名称列表,后面紧跟的返回类型。
每种类型的simple name代表。
public static MethodType fromMethodDescriptorString(String descriptor, ClassLoader loader) throws IllegalArgumentException, TypeNotPresentException
methodType便利方法。任何类或接口的名称嵌入在描述符字符串会在给定的装载机称
ClassLoader.loadClass(java.lang.String)解决(或如果它是空的,在系统类装载器)。
请注意,它是可能遇到的方法类型,不能通过这种方法构建的,因为它们的组件类型不是从一个普通的类装载器所有可访问的。
该方法包括,必须生成字节码处理方法处理和invokedynamic应用效益。
descriptor -字节码级别类型说明符字符串“(T)”
loader的类装载器中查找类型
NullPointerException -如果字符串是空的
IllegalArgumentException -如果字符串形成不好
TypeNotPresentException如果命名类型不能被发现
public String toMethodDescriptorString()
请注意,这不是一个严格的反fromMethodDescriptorString。两个不同的类共享一个共同的名称,但有不同的类装载器将出现相同的时,在描述符的字符串。
该方法包括,必须生成字节码处理方法处理和invokedynamic应用效益。fromMethodDescriptorString,因为后者需要一个合适的类装载器参数。
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.