package net.bytebuddy.implementation; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.implementation.bind.annotation.Argument; import org.junit.Test; import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; import static net.bytebuddy.matcher.ElementMatchers.named; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; public class MethodDelegationArgumentTest { private static final String FOO = "bar", QUX = "qux", BAZ = "baz"; private static final int BAR = 42; @Test public void testArgument() throws Exception { DynamicType.Loaded<Foo> loaded = new ByteBuddy() .subclass(Foo.class) .method(isDeclaredBy(Foo.class)) .intercept(MethodDelegation.to(Bar.class)) .make() .load(Foo.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER); Foo instance = loaded.getLoaded().getDeclaredConstructor().newInstance(); assertThat(instance.foo(FOO, BAR), is((Object) (QUX + FOO + BAR))); } @Test public void testHierarchyDelegation() throws Exception { new ByteBuddy() .subclass(Baz.class) .method(named("foo")) .intercept(MethodDelegation.to(new Qux())) .make() .load(Baz.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER) .getLoaded() .getDeclaredConstructor() .newInstance() .foo(); } public static class Foo { public Object foo(String s, Integer i) { return null; } } public static class Bar { public static String qux(@Argument(1) Integer i, @Argument(0) String s) { return QUX + s + i; } public static String baz(String s, Object o) { return BAZ + s + o; } } public static class Baz { public void foo() { } } public static class Qux extends Baz { @Override public void foo() { super.foo(); } } }