【问题标题】:Java 7 - MethodHandles - invokeExact() and bindTo()Java 7 - MethodHandles - invokeExact() 和 bindTo()
【发布时间】:2016-02-23 01:22:59
【问题描述】:

关于 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);
    }
}

【问题讨论】:

    标签: java java-7 methodhandle


    【解决方案1】:

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

    【讨论】:

    • 在效率方面没有区别,因为在已经绑定的句柄上调用 bindTo 会产生与 insertArguments 相同的内部 bindArgument 调用。但是使用bindTo 作为参数会降低代码的可读性(隐藏意图)并且对于原始类型参数会失败。
    • 请解释如何修改代码示例以允许绑定到新的接收器对象。如示例所示,在第二次绑定尝试时会引发 IllegalArgumentException。此外,重新绑定句柄的能力并不能真正回答我的任何问题。有没有办法确定句柄当前绑定的接收器类型?
    • @Holger,然后实现发生了变化。好吧,您也应该避免多次 insertArguments 调用,而应该只调用一次,因为这使得句柄对于优化代码当然更容易理解。
    • @jaco0646 基本上 bind 和 bindTo 做的是设置句柄的第一个参数。在 Object#toString() 的情况下,第一个参数将是调用 toString() 方法的实例。现在 Lookup#bind 已经这样做了。这意味着您将获得一个已设置唯一可用参数的句柄。因此,进一步尝试设置参数失败。因此,您应该在此处使用 Lookup#findVirtual 并且处理您可以调用一次 bindTo 来获取另一个句柄,该句柄已经设置了唯一的参数。这样你就可以用不同的集合接收器产生不同的句柄。
    • @jaco0646:您需要了解MethodHandle 不仅仅是反射Method 对象的替代品;它封装实际动作。查看两个句柄时,封装无参数方法Foo.method() 的句柄或已预先绑定到Bar 实例的单参数方法Bar.method(Foo) 之间没有区别。而且它根本不必是实例方法; static 方法 SomeClass.x(Foo) 以及对 static 类型为 Foo 的字段的写入操作也将具有相同的签名。
    猜你喜欢
    • 1970-01-01
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2013-11-24
    • 2013-11-12
    相关资源
    最近更新 更多