【发布时间】:2021-04-05 10:28:58
【问题描述】:
我想将 javagent 的“agentArgs”参数传递给我的建议。我怎样才能做到这一点?
public static void premain(String agentArgs, Instrumentation inst) {
new AgentBuilder.Default()
.type(named("org.some.class"))
.transform((builder, type, classLoader, module) ->
builder.method(named("myMethod"))
.intercept(Advice.to(MyAdvice.class))
).installOn(inst);
}
public static class MyAdvice {
@Advice.OnMethodEnter
public static void myMethod(@Advice.AllArguments Object[] args) {
// agentArgs???
}
}
@Rafael Winterhalter 建议的可行解决方案:
public static void premain(String agentArgs, Instrumentation inst) {
new AgentBuilder.Default()
.type(named("org.some.class"))
.transform((builder, type, classLoader, module) ->
builder.method(named("myMethod"))
.intercept(Advice.withCustomMapping().bind(AgentArguments.class, agentArgs).to(MyAdvice.class))
).installOn(inst);
}
// New annotation to pass the variable
@Retention(RetentionPolicy.RUNTIME)
public @interface AgentArguments {
}
public static class MyAdvice {
// I can read the variable by adding it to the method signature
@Advice.OnMethodEnter
public static void myMethod(@Advice.AllArguments Object[] args, @AgentArguments String agentArguments) {
System.out.println(agentArguments);
}
}
【问题讨论】:
-
premain是static并且可能只调用了一次。您不认为通过静态字段或静态 getter 方法提供参数是合理的吗?我认为没有必要在这里把事情复杂化。 -
不幸的是静态字段不起作用,使用Advice时似乎不可用,但下面有一个可行的解决方案
-
恐怕“不起作用”不能作为解释。它在某些情况下确实有效,而在其他情况下则无效。这一切都取决于你如何启动你的代理,它的主类在哪个类加载器中,以及目标类在哪个类加载器中。如果目标类可以看到代理类,它就可以工作。否则不会。
标签: java byte-buddy javaagents