如何使用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"
}
}
现在有接口了,想用字节哥来创建委托实现
比如我有这样一个接口:
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"
}
}