关于MethodHandle类的两个问题:
每次调用invokeExact()是否都需要返回值的类型转换(返回void或Object的目标方法除外)?
看起来MethodHandle只能绑定到接收器一次。给定一个任意的MethodHandle实例,有没有办法确定它是否已被绑定,如果是,是什么类型?
public static void main(String[] args) throws Throwable {
MethodHandles.Lookup lookup = MethodHandles.publicLookup();
MethodHandle handle = lookup.bind(new Object(), "toString", MethodType.methodType(String.class));
String s = (String) handle.invokeExact();
System.out.println(s);
try {
handle.invokeExact();
}
catch (WrongMethodTypeException e) {
System.out.println(e);
}
try {
handle.bindTo(new Object());
}
catch (IllegalArgumentException e) {
System.out.println(e);
}
}
答案 0 :(得分:0)
您可以多次调用bindTo,但不应该。该实现假定您要设置接收器,如果您开始使用它也设置参数,您生成一个更复杂的句柄,这更难编译成lambda表单,然后可能效率较低。我建议使用MethodHandles#insertArguments而不是