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似乎什么都不做。
答案 0 :(得分:0)
委托正在成功,因为Byte Buddy决定Object::equals
是可以绑定到适配器的最佳方法。它无法绑定foo2
方法,因为它期望两个类型为String
和Integer
的参数,而foo
仅声明Object[]
。
您要定义的委托人是:
Object foo2(@Argument(0) Object[] arguments) {
System.out.println(arguments[0] + "=>" + arguments[1]);
return arguments[0];
}
参数绑定正确。否则,您可能希望使用MethodCall
检测器来爆炸数组参数。在这种情况下,您需要使用动态类型,因为无法证明使用字符串和整数调用foo
。