1

メソッド ハンドルのメソッド パラメータがわかりません。まず、以下に示すように、test メソッド ハンドルを使用してガードを作成します。

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");

    }
}

私にとっての問題は、パラメーターが 3 つのメソッド ハンドル (test、trueTarget、および faliover) にどのように渡されるかということです。1、invokeExact の最初のパラメーター「result」がレシーバーとしてテスト ガードに渡され、2 番目のパラメーター「data」が startWith に渡されます。

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

But the these three parameters are passed to the falseTarget as:

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

So, what's the rule for parameters passing and how do they match to the methods referenced by a method handle?

4

1 に答える 1

1

これは、のJavadocに表示されますfindVirtual

呼び出されると、ハンドルは最初の引数をレシーバーとして扱い、レシーバーの型でディスパッチして、どのメソッド実装に入るかを決定します。

まさにあなたが説明したとおりです。staticメソッドにはレシーバーがないため、すべての引数はメソッドのinvokeExact引数と見なされます。

于 2015-01-20T15:48:46.090 に答える