使用 ByteBuddy 将对象数组传递给特定参数的 MethodDelegation

MethodDelegation with Passing Object Array to Specific Parameters Using ByteBuddy

interface Foo{
    Object foo(Object... args);
}

static class FooAdapter{
    Object foo2(String msg, Integer age) {
        System.out.println(msg+"=>"+age);
        return age;
    }
}

public static void main(String[] args) throws Exception{
    FooAdapter adapter = new FooAdapter();
    Foo foo = new ByteBuddy()
            .subclass(Foo.class)
            .method(ElementMatchers.named("foo"))
            .intercept(MethodDelegation.to(adapter))
            .make()
            .load(ClassLoader.getSystemClassLoader())
            .getLoaded()
            .newInstance();
    foo.foo("hello", 10);
}

我的代码很简单,我只想将 Delegate My Foo 接口 foo 方法调用 FooAdater 实例 foo2 方法。但是当我 运行 测试时,ByteBuddy 似乎什么都不做。

委托成功,因为 Byte Buddy 认为 Object::equals 是可以绑定到您的适配器的最佳方法。它不能绑定 foo2 方法,因为它需要两个 StringInteger 类型的参数,而 foo 只声明 Object[].

您要定义的委托人是:

Object foo2(@Argument(0) Object[] arguments) {
  System.out.println(arguments[0] + "=>" + arguments[1]);
  return arguments[0];
}

参数绑定正确。否则,您可能想要使用 MethodCall 工具,您可以在其中分解数组参数。在这种情况下,您需要使用动态类型,因为无法证明 foo 是用字符串和整数调用的。