gpt4 book ai didi

java - Byte Buddy 在使用 .andThen 时不保留返回值

转载 作者:行者123 更新时间:2023-11-30 10:19:46 27 4
gpt4 key购买 nike

我正在尝试使用 Byte Buddy 在方法完成时执行一些额外的逻辑。这是示例代码:

    T proxyClient = JAXRSClientFactory.fromClient(client, classType, true);
this.configureHttpConduit(conduit, invocationTimeout);

Class buddy = new ByteBuddy()
.subclass(classType)
.method(ElementMatchers.isAnnotatedWith(Path.class))
.intercept(MethodDelegation.to(proxyClient)
.andThen(MethodCall.run(new CloseConnection())))
.make()
.load(this.getClass().getClassLoader(),
Default.INJECTION)
.getLoaded();

return (T) buddy.newInstance();

static class CloseConnection implements Runnable {
void close() {
System.out.println("close connection called");
}

@Override
public void run() {
close();
}
}

当我将委托(delegate)与 .andThen 调用链接在一起时,此实例的原始调用者会丢失来自“proxyClient”对象的返回值,该对象之前曾用于对其调用方法。我是不是用错了字节好友?

基本上我想在方法的末尾添加一些额外的逻辑(在原始方法内部或添加另一个方法调用都没有关系),但同时保留原始方法调用的返回值。

最佳答案

这是设计使然。对于您通过 andThen 链接的每个 Implementation,Byte Buddy 都希望下一个 block 有一个空堆栈。因此,最后的实现负责返回。

字节好友的想法是把尽可能多的逻辑放到拦截器中。我建议您编写自己的拦截器来调用委托(delegate),然后调用关闭连接。这使您还可以完全控制调用条件,例如在 finally block 中关闭:

public class MyInterceptor<T> {

final T proxyClient;

@RuntimeType
public Object intercept(@Origin Method method,
@AllArguments Object[] args) throws Throwable {
try {
return method.invoke(proxyClient, args);
} finally {
// do your completion logic here
}
}
}

这当然可以在性能方面进行改进。看看 @Pipe annotation为此。

关于java - Byte Buddy 在使用 .andThen 时不保留返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48481843/

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