使用 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
。
我目前正在尝试制作一个记录器代理,我目前正在拦截 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
。