Инструментарий с использованием ByteBuddy не работает на сторонних классах - PullRequest
1 голос
/ 23 мая 2019

Инструментарий с использованием 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

1 Ответ

0 голосов
/ 24 мая 2019

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 внутри цепочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...