2015-01-20 8 views
1

메서드 핸들에 대한 메서드 매개 변수와 혼동 스럽습니다. 아래 그림과 같이 내가 먼저 guardwithtest 방법 핸들을 구축 : 테스트, trueTarget 및 faliover을 :MethodHandle InvokeExact 매개 변수

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

    } 
} 

나를 위해 문제는 매개 변수 세 가지 방법으로 전달하는 방법을 처리하는 것입니다. 1, invokeExact "결과"에 대한 첫 번째 매개 변수는 수신기로 시험 가드에 전달하고, 두 번째 파라미터는 "데이터는"startWith에 전달됩니다

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

을 그러나 이러한 세 개의 매개 변수로 falseTarget에 전달됩니다 :

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

매개 변수 전달에 대한 규칙은 무엇이며 메서드 핸들에서 참조하는 메서드와 어떻게 일치합니까? 전화했을 때

답변

1

이 핸들이 구현 입력 방식을 결정하기 위해 수신기의 종류에 수신기 파견으로 첫 번째 인수를 취급, ​​findVirtual

의 자바 독에 나타납니다.

정확하게 설명했습니다. static 메서드에는 수신기가 없으므로 invokeExact에 대한 모든 인수는 메서드에 대한 인수로 간주됩니다.