gpt4 book ai didi

java - Byte Buddy 的方法委托(delegate)

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:36 27 4
gpt4 key购买 nike

我在获取一个使用 Byte Buddy 的简单示例时遇到了问题,这是我的代码:

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:" + 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 ();
}
}
}

我希望它能够工作并将调用转发给受尊重的拦截器实例,但是我得到了这个异常:

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 for delegation from public java.lang.Void net.bytebuddy.renamed.java.lang.Object$ByteBuddy$P87HQ3lQ.bar(java.lang.String,java.lang.Integer)
at net.bytebuddy.implementation.bind.MethodDelegationBinder$Processor.process(MethodDelegationBinder.java:881)
at net.bytebuddy.implementation.MethodDelegation$Appender.apply(MethodDelegation.java:1218)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:510)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:444)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:3193)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:1481)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:234)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase$AbstractDelegatingBuilder.make(DynamicType.java:2177)
at Foo.main(Foo.java:55)

最奇怪的部分是在该异常消息的最后:

[...] public void Foo$Bar.bar(java.lang.String,java.lang.Integer)] allows for delegation from public java.lang.Void net.bytebuddy.renamed.java.lang.Object$ByteBuddy$P87HQ3lQ.bar(java.lang.String,java.lang.Integer)

我做错了什么?

最佳答案

您的假设是正确的。 Byte Buddy 无法将 void 非类型分配给 Void 类型。但是,当您使用 @RuntimeType 注释拦截器时,Byte Buddy 可以将 null 分配给 void 方法的引用类型:

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:" + i + " s:" + s);
}
}

关于java - Byte Buddy 的方法委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34659909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com