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

时间:2018-03-09 08:28:37

标签: java monitoring agent byte-buddy

我正在尝试创建一个记录器代理,我正在拦截类PrepareStatement。 在PrepareStatement中,我想跟踪多种方法,但我感觉我做错了。

通常我现在所做的是拦截我希望监控的每个方法,并将代理生成器安装到这样的仪器上:

static void Main(string[] args)
{
    DoSomething();

    int x = HowMuchErrorsDidICatch(); // This is where 

    Console.WriteLine("This run catched {0} Exception.", x);
}

// Some work to do..
static void DoSomething()
{
    for (int i = 0; i < 1001; i++)
    {
        try
        {
            // .. Processing some Data
            if (i % 10 == 0)
                throw new Exception("Something went wrong.");
        }
        catch (Exception ex)
        {
            errorCount++;
            // Handling the Exception
        }
    }
}

#region What i'm searching for
// I hope to get those number from .Net
static int errorCount = 0;
private static int HowMuchErrorsDidICatch()
{
    return errorCount;
}
#endregion

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

我正在努力实现的一些伪代码:

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);
}

我如何更优雅地实现这一目标? 这是如何通过多个类完成的?

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

1 个答案:

答案 0 :(得分:2)

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