【发布时间】:2020-10-08 07:42:14
【问题描述】:
我正在尝试使用 bytebuddy 添加查询参数以请求 url 这是我的代码:
new AgentBuilder.Default()
.disableClassFormatChanges()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(hasSuperType(named("org.springframework.web.client.RestTemplate")))
.transform(new Transformer.ForAdvice().include(MyByteBuddy.class.getClassLoader())
.advice(ElementMatchers.named("execute"), "agent.RestTemplateAdvice"))
.installOn(instrumentation);
建议是
@Advice.OnMethodEnter
public static void before(@Advice.AllArguments Object[] args) {
System.out.println("!!!!!!!!!!!");
String data = args[0].toString();
data = (data + "asdgb?param=myparam");
System.out.println(data);
args[0] = (Object)data;
System.out.println(args[0]);
}
我得到的输出是
!!!!!!!!!!!
http://localhost:8086/movies/5678asdgb?param=myparam
http://localhost:8086/movies/5678
我也尝试过以下建议,但这个甚至没有捕获方法调用。
@Advice.OnMethodEnter
public static void before(@Advice.Argument(0) String argument) {
System.out.println("!!!!!!!!!!!");
argument = (argument + "asdgb?param=myparam");
System.out.println(argument);
}
【问题讨论】:
-
要不要同时显示你要改造的目标类+方法呢?查看
RestTemplatejavadoc,有三个execute方法,但其中只有两个具有String作为第一个参数,第三个具有URI。也许你称之为那个,这就是建议不匹配的原因。但我现在只是推测,因为我没有看到目标类以及它是如何被调用的。 -
感谢@kriegaex。我能够解决这个问题。谷歌搜索后。正确的做法是 @Advice.Argument(value = 0, typing = Typing.DYNAMIC, readOnly = false) 字符串参数。设置后,我可以更改参数值。
-
是的,也许可以,但您的代码仍然无法为
execute方法运行,因为您将第一个参数更改为始终为String。所以你的解决方案不稳定。要么限制匹配器中的方法签名,要么扩展您的建议以正确处理URI案例。这只是一个 hacky 解决方案。
标签: java byte-buddy javaagents