使用 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
方法,因为它需要两个 String
和 Integer
类型的参数,而 foo
只声明 Object[]
.
您要定义的委托人是:
Object foo2(@Argument(0) Object[] arguments) {
System.out.println(arguments[0] + "=>" + arguments[1]);
return arguments[0];
}
参数绑定正确。否则,您可能想要使用 MethodCall
工具,您可以在其中分解数组参数。在这种情况下,您需要使用动态类型,因为无法证明 foo
是用字符串和整数调用的。
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
方法,因为它需要两个 String
和 Integer
类型的参数,而 foo
只声明 Object[]
.
您要定义的委托人是:
Object foo2(@Argument(0) Object[] arguments) {
System.out.println(arguments[0] + "=>" + arguments[1]);
return arguments[0];
}
参数绑定正确。否则,您可能想要使用 MethodCall
工具,您可以在其中分解数组参数。在这种情况下,您需要使用动态类型,因为无法证明 foo
是用字符串和整数调用的。