[英]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.