[英]ByteBuddy invoke constructor in same class with argument transformation
[英]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.