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);
}
Мой код прост, я просто хочу делегировать foo
вызов метода интерфейса Foo FooAdater
foo2
методу экземпляра. Но когда я запускаю тест, ByteBuddy, кажется, ничего не делает.
Делегирование успешно, потому что Byte Buddy решает, что
Object::equals
это лучший метод, который может быть привязан к адаптеру. Он не может связатьfoo2
метод, потому что он ожидает два аргумента типаString
иInteger
покаfoo
только объявляетObject[]
.Делегатор, который вы хотите определить:
где аргумент связан правильно. В противном случае может потребоваться
MethodCall
инструментирование, в котором можно развернуть аргументы массива. В этом случае необходимо использовать динамический ввод, так как нет способа доказать, чтоfoo
вызывается со строкой и целым числом.