MethodHandle InvokeExact参数

时间:2015-01-20 15:38:24

标签: java invocation invokedynamic methodhandle

我对方法句柄的方法参数感到困惑。我首先构建一个guardwithtest方法句柄,如下所示:

public class App 
{
    public static void trueTarget(String str, String own, String t){
        System.out.println("This is true target "+str+" "+own + " "+t);
    }

    public static void falseTarget(String str, String own, String t){
        System.out.println("This is false target " + str+"  "+own +" "+t);
    }

    public static void main( String[] args ) throws Throwable
    {
        MethodHandle test = MethodHandles.publicLookup().findVirtual(String.class, "startsWith", 
                MethodType.methodType(boolean.class, String.class));

        System.out.println((boolean)test.invokeExact("result", "res"));

        MethodHandle target = MethodHandles.lookup().findStatic(App.class, "trueTarget", MethodType.methodType(void.class, String.class, String.class, String.class));
        MethodHandle fallback = MethodHandles.lookup().findStatic(App.class, "falseTarget", MethodType.methodType(void.class, String.class, String.class, String.class));

        MethodHandle gwd = MethodHandles.guardWithTest(test, target, fallback);

        gwd.invokeExact("result", "data", "sijie");

    }
}

问题在于我如何将参数传递给三个方法句柄:test,trueTarget和faliover。 1,invokeExact的第一个参数"结果"作为接收器传递给测试保护,第二参数"数据"传递给startWith:

      String.startsWith(String)
      "result"          "data"  

但是这三个参数传递给falseTarget:

      falseTarget(String str, String own, String t)
                        "result"      "data"     "sijie"

那么,参数传递的规则是什么以及它们如何与方法句柄引用的方法匹配?

1 个答案:

答案 0 :(得分:1)

这出现在findVirtual

的Javadoc中
  

调用时,句柄会将第一个参数视为接收者   并在接收器的类型上发送以确定哪种方法   实施进入。

正如你所描述的那样。 static方法没有接收者,因此invokeExact的所有参数都被认为是该方法的参数。