Инструментарий с использованием 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);
}
}
}
Ожидаемый результат - печать входов и выходов при вызове execute в классе AmazonHttpClient.
Примечание. Агент динамически подключается с использованием следующей библиотеки: https://github.com/electronicarts/ea-agent-loader