当我尝试检测第 3 方类时,使用 ByteBuddy 的检测不起作用
我设法创建了可以检测我自己的代码的代码,并且一切都按预期工作。 当我尝试对属于第三方依赖项的类使用相同的代码时,检测不起作用。
这段代码对我有用:
public class A {
public void print(){
System.out.println("in class A method 'print'");
}
}
public class AgentLoad {
public static void agentmain(String agentArgs, Instrumentation inst) throws Exception {
final ElementMatcher.Junction<NamedElement> matcher = ElementMatchers.named("com.instrumentation.A");
new AgentBuilder.Default()
.type(matcher)
.transform( new AgentBuilder.Transformer.ForAdvice()
.include(AgentLoad.class.getClassLoader())
.advice(named("print"), AAdvice.class.getName()))
.installOn(inst);
}
public static void main(String[] args) throws Exception{
AgentLoader.loadAgentClass(AgentLoad.class.getName(), null);
}
public static class AAdvice {
@Advice.OnMethodEnter
public static void enter() {
System.out.println("Enter Yes!!!!");
}
@Advice.OnMethodExit
public static void exit() {
System.out.println("Exist Yes!!!!");
}
}
}
此代码对我不起作用:
public static void agentmain(String agentArgs, Instrumentation inst) {
AgentBuilder builder = new AgentBuilder.Default();
builder.type(ElementMatchers.named("com.amazonaws.http.AmazonHttpClient"))
.transform( new AgentBuilder.Transformer.ForAdvice()
.include(AgentLoad.class.getClassLoader())
.advice(ElementMatchers.named("execute").and(isAnnotatedWith(SdkInternalApi.class)),
AmazonHttpClientAdvice.class.getName()));
builder.installOn(inst);
}
public static class AmazonHttpClientAdvice {
@Advice.OnMethodEnter
public static void executeEnter(@Advice.Argument(0) Request<?> request) {
System.out.println("Eenter !!!" + request);
}
@Advice.OnMethodExit
public static void exit(@Advice.Return(readOnly = false, typing = DYNAMIC) Object returned) {
System.out.println("Exist !!!! " + returned);
}
}
}
预期结果是在 AmazonHttpClient 类中调用“execute”时打印进入和退出的信息。
注意:代理使用下一个库动态附加:https://github.com/electronicarts/ea-agent-loader
最佳答案
Byte Buddy 的 API 是不可变的,所有方法调用都没有副作用,但仅返回一个新的构建器实例。这意味着:
AgentBuilder builder = new AgentBuilder.Default();
builder.type(ElementMatchers.named("com.amazonaws.http.AmazonHttpClient"))
.transform(new AgentBuilder.Transformer.ForAdvice()
.include(AgentLoad.class.getClassLoader())
.advice(ElementMatchers.named("execute").and(isAnnotatedWith(SdkInternalApi.class)),
AmazonHttpClientAdvice.class.getName()));
builder.installOn(inst);
不执行任何操作。您需要再次将构建器链的结果重新分配给构建器变量或在链内调用installOn
。
关于java - 使用 ByteBuddy 的检测不适用于第 3 方类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56274352/