如何使用byte-buddy创建可以修改方法返回值的委托class?

How to use byte-buddy to create delegated class that can modify method returned value?

现在有接口了,想用字节哥来创建委托实现

比如我有这样一个接口:

public interface Foo {
    String foo();
}

我想像这样动态创建一个 class:

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();

但是不知道如何修改方法委托的返回值

我怎样才能做到这一点?

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

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