繁体   English   中英

使用ByteBuddy检测同一类中的多个方法

[英]Instrumenting multiple methods within same class with ByteBuddy

我目前正在尝试制作一个记录器代理,目前正在其中拦截类PrepareStatement。 在PrepareStatement中,我希望跟踪多种方法,但是我感觉自己做错了。

通常,我现在要做的是拦截希望监视的每种方法,并将该agentbuilder安装到工具中,如下所示:

private static void Install(String className, String methodName,
        Instrumentation instr) {
    new AgentBuilder.Default().disableClassFormatChanges()
            .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
            .type(ElementMatchers.hasSuperType(ElementMatchers.named(className)))
            .transform((builder, typeDescription, classLoader, module) -> {
                return builder.visit(Advice.to(MyInterceptor.class)
                        .on(ElementMatchers.named(methodName)));
            }).installOn(instrumentation);
}

.installOn(instr); 感觉不对,因为我真正想做的是将许多建议应用于同一个变压器,然后将其安装到仪器。

我正在尝试实现的一些伪代码:

private static AgentBuilder Install(String className, 
        Instrumentation instr) {
    return new AgentBuilder.Default().disableClassFormatChanges()
            .with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
            .type(ElementMatchers.hasSuperType(ElementMatchers.named(className)))
            .transform((builder, typeDescription, classLoader, module) -> {
                builder.visit(Advice.to(MyFirstInterceptor.class)
                        .on(ElementMatchers.named("first method")));
                builder.visit(Advice.to(MySecondInterceptor.class)
                        .on(ElementMatchers.named("second method")));
            });
}

我将如何更优雅地实现这一目标? 如何通过多个类完成此操作?

感谢任何帮助! 亲切的问候。

如果使用Advice作为访客,则装饰物可以组成:

return builder
  .visit(Advice.to(MyFirstInterceptor.class)
               .on(ElementMatchers.named("first method")))
  .visit(Advice.to(MySecondInterceptor.class)
               .on(ElementMatchers.named("second method")));

如果要定位多个类型,则还可以在安装之前链接多个type语句。 如果多个这样的匹配器匹配一个类型,则除非您在DSL中指定了asDecorator ,否则只有最后一个类型被匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM