假设你有MethodHandle,并指定了一些参数,如何在设置后更改这些参数?
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);
}
}我尝试过使用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";
}但我得到了一个例外:
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)发布于 2016-06-14 16:26:15
2种方法:
methodHandle MethodHandle = MethodHandles.lookup().findVirtual(SomeTest.class,"someMethod",methodType(void.class,String.class));MethodHandle hi = methodHandle.insertArguments(1,"Hi");MethodHandle hello = methodHandle.insertArguments(1,"Hello");hi.invoke(新SomeTest());// "Hi“hello.invoke(新SomeTest());//”Hello“
公共静态类StringHolder{公共字符串toPrint;StringHolder(String toPrint){ this.toPrint = toPrint;}}公共静态空main(String[] args)抛出Throwable { MethodHandle toPrintGetter = lookup().findGetter(StringHolder.class,"toPrint",String.class);MethodHandle someMethod = lookup().findVirtual(SomeTest.class,"someMethod",MethodType.methodType(,));holder = new (“Hi”);someMethod = MethodHandles.filterArguments(someMethod,1,MethodHandles.exactInvoker(MethodType.methodType(String.class)));MethodHandle stringPrinter = MethodHandles.insertArguments(someMethod,1,toPrintGetter.bindTo(holder));stringPrinter.invokeExact(新SomeTest());//打印"Hi“holder.toPrint = "Hello";stringPrinter.invokeExact(新SomeTest());//打印"Hello”}
https://stackoverflow.com/questions/37695759
复制相似问题