java - Method delegation with Byte Buddy -
i have problem getting simple example working byte buddy, here's code:
import static java.util.arrays.aslist; import java.util.stream.stream; import net.bytebuddy.bytebuddy; import net.bytebuddy.dynamic.loading.classloadingstrategy; import net.bytebuddy.implementation.methoddelegation; public class foo { public static class bar { public void bar (string s, integer i) { system.out.println ("s:" + s + " i:" + i); } } public static class baz { public void baz (integer i, string s) { system.out.println ("i:" + + " s:" + s); } } public static void main (string[] args) { try { class<?> c = new bytebuddy () .subclass (object.class) .definemethod ("bar", void.class, aslist (string.class, integer.class), 1) .intercept (methoddelegation.to (new bar ())) .definemethod ("baz", void.class, aslist (integer.class, string.class), 1) .intercept (methoddelegation.to (new baz ())) .make () .load (foo.class.getclassloader (), classloadingstrategy.default.wrapper) .getloaded (); stream.of (c.getdeclaredmethods ()).foreach (system.out::println); } catch (exception e) { e.printstacktrace (); } } }
which expect work , forward calls respected interceptor instances, exception:
java.lang.illegalargumentexception: none of [protected void java.lang.object.finalize() throws java.lang.throwable, public final void java.lang.object.wait(long,int) throws java.lang.interruptedexception, public final native void java.lang.object.wait(long) throws java.lang.interruptedexception, public final void java.lang.object.wait() throws java.lang.interruptedexception, public boolean java.lang.object.equals(java.lang.object), public java.lang.string java.lang.object.tostring(), public native int java.lang.object.hashcode(), public final native java.lang.class java.lang.object.getclass(), protected native java.lang.object java.lang.object.clone() throws java.lang.clonenotsupportedexception, public final native void java.lang.object.notify(), public final native void java.lang.object.notifyall(), public void foo$bar.bar(java.lang.string,java.lang.integer)] allows delegation public java.lang.void net.bytebuddy.renamed.java.lang.object$bytebuddy$p87hq3lq.bar(java.lang.string,java.lang.integer) @ net.bytebuddy.implementation.bind.methoddelegationbinder$processor.process(methoddelegationbinder.java:881) @ net.bytebuddy.implementation.methoddelegation$appender.apply(methoddelegation.java:1218) @ net.bytebuddy.dynamic.scaffold.typewriter$methodpool$record$fordefinedmethod$withbody.applybody(typewriter.java:510) @ net.bytebuddy.dynamic.scaffold.typewriter$methodpool$record$fordefinedmethod.apply(typewriter.java:444) @ net.bytebuddy.dynamic.scaffold.typewriter$default$forcreation.create(typewriter.java:3193) @ net.bytebuddy.dynamic.scaffold.typewriter$default.make(typewriter.java:1481) @ net.bytebuddy.dynamic.scaffold.subclass.subclassdynamictypebuilder.make(subclassdynamictypebuilder.java:234) @ net.bytebuddy.dynamic.dynamictype$builder$abstractbase$abstractdelegatingbuilder.make(dynamictype.java:2177) @ foo.main(foo.java:55)
the weirdest part being @ end of exception message:
[...] public void foo$bar.bar(java.lang.string,java.lang.integer)] allows delegation public java.lang.void net.bytebuddy.renamed.java.lang.object$bytebuddy$p87hq3lq.bar(java.lang.string,java.lang.integer)
what doing wrong?
you right assumption. byte buddy cannot assign void
non-type void
type. byte buddy can assign null
reference type void method, when annotated interceptors @runtimetype
:
public class bar { @runtimetype public void bar (string s, integer i) { system.out.println ("s:" + s + " i:" + i); } } public class baz { @runtimetype public void baz (integer i, string s) { system.out.println ("i:" + + " s:" + s); } }
Comments
Post a Comment