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

时间:2016-12-31 04:54:41

标签: java byte-buddy

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);
}

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

1 个答案:

答案 0 :(得分:0)

委托正在成功,因为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