当前位置: 首页 > 知识库问答 >
问题:

Byte Buddy不保存返回值时。然后使用

曾珂
2023-03-14

当一个方法完成时,我试图使用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();
    }
  }

当我把代表团和。第二次调用时,此实例的原始调用方将丢失来自“proxyClient”对象的返回值,该对象以前用于调用它的方法调用。我是不是用错了?

基本上,我希望在方法的末尾添加一些附加逻辑(在原始方法内部或添加另一个方法调用并不重要),但同时保留原始方法调用的返回值。

共有1个答案

柳珂
2023-03-14

这是故意的。对于通过链接的每个实现,Byte Buddy期望下一个块有一个空堆栈。因此,最后一个实现负责返回。

字节伙伴的想法是将尽可能多的逻辑放入拦截器。我建议您编写自己的拦截器来调用委托,然后调用紧密连接。这也使您能够完全控制调用条件,例如在finally块中关闭:

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注释。

 类似资料:
  • 问题内容: 我正在尝试使用“ any”匹配器对这个getKeyFromStream方法进行存根。我尝试了更明确和不太明确的(anyObject()),但似乎无论我如何尝试,此存根都不会在我的单元测试中返回fooKey。 我想知道是否是因为它受到保护,或者我缺少其他东西或做错了什么。在整个测试中,我还有其他的when / then语句在 起作用, 但是由于某种原因,事实并非如此。 注意:getKey

  • 原文是这样的: 这确实令人惊讶,但最终明白了(嗯,至少我想我明白了)为什么会这样发生。 现在,我将第二个更改为: 如果我遗漏了一些明显的东西,或者我的问题是愚蠢的,让我提前说声对不起。还有谢谢你!

  • 测试类别 测试类别 详图搁置器 当我尝试模拟方法HistoryFromStrgyTable()的数据时,它实际上是在调用HistoryFromStrgyTable(),而不是从mockHistoryFromStrgyTable()获取数据。 我的测试用例在这一行失败了 谁能帮我一下吗。我不明白怎么了。我还将方法mockHistoryFromStrgyTable()从private更改为public

  • 我正在使用PowerMockito验证私有方法的调用数:。我还将该方法存根以返回预定义的值。 尽管我已将方法存根,但实际的实现正在被调用,并抛出一个,因为它的依赖项(“loader”变量,请参见下面的代码片段)没有为此测试定义(也不应该定义)。 作为实验,我把方法改成公开,然后就没问题了! 我认为这是PowerMockito中的一个错误,但我在比这更确定的事情上错了! 这是密码 为了澄清,类看起来

  • 我对反应性编程相对较新。我的问题是关于

  • 我正在尝试使用JpaRepository、spring boot和mysql发布文章 我有一张像这样的桌子 每当我尝试保存数据时,无论我传递什么值,列user总是0。 存储库如下所示 控制器如下所示