gpt4 book ai didi

java - 如何使用byte-buddy创建可以修改方法返回值的委托(delegate)类?

转载 作者:太空宇宙 更新时间:2023-11-04 09:18:45 25 4
gpt4 key购买 nike

现在有了一个接口(interface),我想使用byte buddy来创建一个委托(delegate)实现。

比如我有这样一个界面:

public interface Foo {
String foo();
}

我想动态创建一个这样的类:

public class FooImpl implements Foo {
private final Foo delegate;

public FooImpl(Foo delegate) {
this.delegate = delegate;
}

@Override
public String foo() {
return delegate.foo() + "_suffix";
}
}

我得到了这个:

Class<? extends Foo> clazz = new ByteBuddy().subclass(Foo.class, NO_CONSTRUCTORS)
.defineField("delegate", Foo.class, PRIVATE | FINAL)
.defineConstructor(PUBLIC)
.withParameter(Foo.class)
.intercept(MethodCall.invoke(Object.class.getConstructor())
.andThen(FieldAccessor.ofField("delegate").setsArgumentAt(0)))
.method(ElementMatchers.isDeclaredBy(Foo.class)
.and(ElementMatchers.returns(String.class)))
.intercept(MethodDelegation.toField("delegate"))
.make()
.load(Foo.class.getClassLoader())
.getLoaded();

但是我不知道如何修改方法委托(delegate)的返回值。

我怎样才能实现这个目标?

最佳答案

我认为您不想直接委托(delegate)给Foo。相反,实现一个单独的委托(delegate)类,其中参数之一由 @FieldValue("delegate") 注释,然后调用返回转换值的相关方法。然后从拦截方法返回该值,该方法表示代理返回的方法。例如:

public class MyDelegator {
public static String intercept(@FieldValue("delegate") Foo delegate) {
return delegate.foo() + "_suffix"
}
}

关于java - 如何使用byte-buddy创建可以修改方法返回值的委托(delegate)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58620703/

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