簡體   English   中英

如何使用 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")注釋,然后調用返回轉換值的相關方法。 然后從代表代理返回的方法的攔截方法返回此值。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM