0

关于 MethodHandle 类的两个问题:

  1. 是否每次调用 invokeExact() 都需要对返回值进行类型转换(返回 void 或 Object 的目标方法除外)?

  2. 似乎 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);
    }
}
4

1 回答 1

0

您可以多次调用 bindTo,但不应该这样做。该实现假设您要设置接收器,如果您开始使用它来设置参数,则会产生更复杂的句柄,这更难以编译成 lambda 形式,然后可能效率较低。我建议改用 MethodHandles#insertArguments

于 2014-03-11T10:36:35.253 回答