2016-05-30 5 views
1

En Java, je suis capable de combiner plusieurs poignée de méthode avec chacun de ses paramètres, comme ceci:Java MethodHandle; utiliser le paramètre dans plusieurs emplacements

foo(a, bar(2, b)) 

..by utilisant MethodHandles.collectArguments().

La poignée de méthode que je reçois peut être appelé comme ceci:

myHandle.invokeExact(5, 6); // invokes foo(5, bar(2, 6)) 

Mais maintenant, je voudrais obtenir une poignée de méthode qui envoie ses paramètres dans l'arborescence des appels comme celui-ci:

MethodHandle myHandle = ...; // foo(*x*, bar(2, *x*)) 
myHandle.invokeExact(3); // replaces x by 3 in both locations 
// this call represents 'foo(3, bar(2, 3));' 

Je n'arrive pas à comprendre comment faire ça. Pouvez-vous m'aider?

Répondre

2

Comme d'habitude pour Java Méthode Poignées, pas beaucoup d'intérêt, alors je vais vous donner la réponse:

Utilisez MethodHandles::permuteArguments combiné avec un MethodType :: dropPatameterTypes() appel.

Dans mon cas, il est tout simplement une question de faire ceci:

MethodHandle handle = [...]; // method handle representing f(x1, x2) = x1 + (x2 - 2) 
MethodHandle h_permute = MethodHandles.permuteArguments(
    handle, 
    handle.type().dropParameterTypes(1, 2), // new handle type with 1 less param 
    0, 
    0); 
// h_permute now represents f(x) = x + (x - 2) 
+0

Je ne dirais pas qu'il n'y a « pas beaucoup d'intérêt », mais la balise 'methodhandle', ayant 41 questions, est tout à fait étroit. L'ajout d'une [tag: réflexion] ou [tag: bytecode], sans correspondre exactement à la question, pourrait attirer l'attention. – Holger