2016-05-30 2 views
1

В Java, я могу объединить несколько дескриптор методы с каждым его параметрами, например:Java MethodHandle; используйте параметр в нескольких местах

foo(a, bar(2, b)) 

..сом использования MethodHandles.collectArguments().

Метод ручки я получаю можно назвать так:

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

Но теперь, я хотел бы получить дескриптор метода, который отправляет его параметры в дереве вызовов, как это:

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

Я не могу окунуться в голову о том, как это сделать. Вы можете мне помочь?

ответ

2

Как обычно для метода Java ручки, не большой интерес, поэтому я дам вам ответ:

Использование MethodHandles::permuteArguments в сочетании с MethodType :: dropPatameterTypes() вызов.

В моем случае, это просто вопрос как это сделать:

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

Я бы не сказал, что есть «не большой интерес», но 'methodhandle' тег, имеющий 41 вопросов, вполне узок. Добавление [tag: reflection] или [tag: bytecode], хотя точно не соответствует этому вопросу, может привлечь внимание. – Holger

Смежные вопросы