java - 使用 ByteBuddy 的检测不适用于第 3 方类

标签 java instrumentation byte-buddy

当我尝试检测第 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/

相关文章:

java - 使用Java,尝试显示带有图像的可滚动jbutton列表,但显示文本而不是按钮

java - 在 Web 项目中定义一组常量的最佳方法是什么?

java - 加载 fragment 时应用程序崩溃

Java 每隔几秒从循环中执行一次方法

c# - 将调试信息注入(inject) Entity Framework 查询

java - 跨 JVM 检测

java - 断言Java中的同步顺序

java - Hibernate 中使用 ByteBuddy 代理的 MethodHandler 陷入无限循环

java - 如何验证和编写测试用例以检查 ASM/Byte Buddy 实例是否在运行时创建

java - Hibernate NoSuchMethodError in Byte buddy 构建 session 工厂时