Java 7 - MethodHandles - invokeExact()和bindTo()

时间:2013-11-04 03:48:31

标签: java java-7 methodhandle

关于MethodHandle类的两个问题:

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

  2. 看起来MethodHandle只能绑定到接收器一次。给定一个任意的MethodHandle实例,有没有办法确定它是否已被绑定,如果是,是什么类型?

  3. 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);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您可以多次调用bindTo,但不应该。该实现假定您要设置接收器,如果您开始使用它也设置参数,您生成一个更复杂的句柄,这更难编译成lambda表单,然后可能效率较低。我建议使用MethodHandles#insertArguments而不是