Quantcast
Channel: Active questions tagged methodhandle - Stack Overflow
Viewing all articles
Browse latest Browse all 36

How to change MethodHandle arguments after being inserted?

$
0
0

Suppose you have MethodHandle and some arguments have been specified, how to change those arguments after being set?

import static java.lang.invoke.MethodType.*;import static java.lang.invoke.MethodHandles.*;import java.lang.invoke.MethodHandle;import java.lang.invoke.MethodHandles;public class SomeTest {    public static void main(String[] args) throws Throwable {        MethodHandle methodHandle = MethodHandles.lookup().findVirtual(SomeTest.class,"someMethod", methodType(void.class, String.class));        methodHandle = MethodHandles.insertArguments(methodHandle, 1, "Hi");        // this invoke calls with "Hi", which is fine        methodHandle.invoke(new SomeTest());        // here, how to change the arguments to be e.g. "Hello" instead of "Hi"        methodHandle.invoke(new SomeTest());    }    public void someMethod(String a) {        System.out.println("Called with "+ a);    }}

I have tried to use MethodHandles.filterArguments()

....    methodHandle = MethodHandles.filterArguments(methodHandle, 1,            MethodHandles.lookup().findStatic(SomeTest.class, "returnSomething",                    methodType(String.class)));    methodHandle.invoke(new SomeTest());}public static String returnSomething() {    return "Hello";}

but I get an exception:

Exception in thread "main" java.lang.IllegalArgumentException: too many filters    at java.lang.invoke.MethodHandleStatics.newIllegalArgumentException(MethodHandleStatics.java:139)    at java.lang.invoke.MethodHandles.filterArgumentsCheckArity(MethodHandles.java:2623)    at java.lang.invoke.MethodHandles.filterArguments(MethodHandles.java:2595)    at test.test.SomeTest.main(SomeTest.java:22)

Viewing all articles
Browse latest Browse all 36

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>