我正在尝试创建一个记录器代理,我正在拦截类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);
}
我如何更优雅地实现这一目标? 这是如何通过多个类完成的?
感谢任何帮助! 亲切的问候。
答案 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
。