首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ByteBuddy中将InvokeDynamic作为参数传递给MethodCall

如何在ByteBuddy中将InvokeDynamic作为参数传递给MethodCall
EN

Stack Overflow用户
提问于 2021-05-11 02:53:47
回答 1查看 49关注 0票数 2

我想生成一个类的字节代码,它将一个方法引用作为参数传递给另一个方法。例如:

代码语言:javascript
复制
public class GeneratedClass {
    public GeneratedClass() {
        Test.foo((Function)Test::getId)
    }
}

使用ByteBuddy,我可以生成一个带有自定义构造函数的类,并创建一个InvokeDynamic来表示Test::getId,但问题是我不能将InvokeDynamic作为参数传递给我的MethodCall。我目前的实现如下:

代码语言:javascript
复制
var fooMethod = Test.class.getMethod("foo",Function.class);
InvokeDynamic methodRef = InvokeDynamic.lambda(Test.class.getMethod("getId"), Function.class)
        .withoutArguments();
new ByteBuddy()
        .subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
        .name("GeneratedClass")
        .defineConstructor(Visibility.PUBLIC)
        .intercept(
                MethodCall.invoke(fooMethod)
                .with((Object)null) \\I want to pass the methodRef instead of null
                .andThen(methodRef)
        ).make()
        .saveIn(new File("target"));

这将生成以下内容:

代码语言:javascript
复制
public class GeneratedClass {
    public GeneratedClass() {
        Test.foo((Function)null);
        Test::getId;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-05-11 15:38:55

到目前为止,领域特定语言还不支持这一点,但是您可以向with提供一个自定义的StackManipulation作为参数。在您的例子中,您需要为此解析一个MethodInvocation

通过一个小技巧,您现在就可以实现这一点,但要创建一个helper方法:

代码语言:javascript
复制
builder = builder
  .defineMethod("mylambda", Function.class, Visibility.PRIVATE, Ownership.STATIC)
  .intercept(methodRef)

然后,您可以使用MethodCall调用此方法并将其作为参数传递。

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

https://stackoverflow.com/questions/67476142

复制
相关文章

相似问题

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