无法使用 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;
}
}
我使用 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;
}
}