首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ByteBuddy的检测在第三方类上不起作用

使用ByteBuddy的检测在第三方类上不起作用
EN

Stack Overflow用户
提问于 2019-05-23 19:36:25
回答 1查看 205关注 0票数 1

当我尝试插入第三方类时,使用ByteBuddy的插入不起作用

我设法创建代码,这些代码插入我自己的代码,一切都像预期的那样工作。当我尝试对类使用相同的代码时,这些类是第三方依赖的一部分,但插装不起作用。

这段代码对我来说是有效的:

代码语言:javascript
复制
public class A {
    public void print(){
        System.out.println("in class A method 'print'");
    }
}
代码语言:javascript
复制
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!!!!");
        }
    }
}

这段代码对我不起作用:

代码语言:javascript
复制
       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”时打印enter和exit。

注意:代理是使用下一个库动态附加的:https://github.com/electronicarts/ea-agent-loader

EN

回答 1

Stack Overflow用户

发布于 2019-05-24 15:29:12

Byte Buddy的API是不可变的,所有的方法调用都没有副作用,只返回一个新的构建器实例。这意味着:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56274352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档