无法使用 Byte Buddy 修改方法调用的 return 值

Unable to modify return value of method invocation using Byte Buddy

我使用 Byte Buddy 编写了一个代理,并试图修改 return 值。

代理代码(部分伪代码):

premain(String args, Instrumentation instrumentation) {
  new AgentBuilder.Default().disableClassFormatChanges()
          .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
          .type(ElementMatchers.is(target.class))
          .transform(
              (builder, typeDescription, classLoader, module) ->
                  builder
                      .visit(
                          Advice.to(CustomAdvice.class).on(ElementMatchers.named("methodName").and(ElementMatchers.isPublic()))))
          .installOn(instrumentation);
}


public class CustomAdvice {
  @Advice.OnMethodExit
  public static String intercept(@Advice.Return String value) {
    System.out.println("intercepted: " + value);
    return "hi: " + value;
  }
}

我的建议有效,但未使用我建议的 return 值。

解决方案是:

public class CustomAdvice {
  @Advice.OnMethodExit
  public static void intercept(@Advice.Return(readOnly = false) String value) {
    System.out.println("intercepted: " + value);
    value = "hi: " + value;
  }
}