使用 ByteBuddy 在同一个 class 中检测多个方法

Instrumenting multiple methods within same class with ByteBuddy

我目前正在尝试制作一个记录器代理,我目前正在拦截 class 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")));
            });
}

我怎样才能更优雅地实现这一点? 这是如何用多个 classes 完成的?

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

如果用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