首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在插入后更改MethodHandle参数?

如何在插入后更改MethodHandle参数?
EN

Stack Overflow用户
提问于 2016-06-08 15:20:58
回答 1查看 544关注 0票数 1

假设你有MethodHandle,并指定了一些参数,如何在设置后更改这些参数?

代码语言:javascript
复制
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()

代码语言:javascript
复制
....
    methodHandle = MethodHandles.filterArguments(methodHandle, 1,
            MethodHandles.lookup().findStatic(SomeTest.class, "returnSomething",
                    methodType(String.class)));

    methodHandle.invoke(new SomeTest());
}

public static String returnSomething() {
    return "Hello";
}

但我得到了一个例外:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 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“

  • 将第二个参数绑定到您操作的类成员的getter方法。您必须使用"exactInvoker“来过滤参数,该参数将执行getter以实际获得字符串值。请参见:

公共静态类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”}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37695759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档