gpt4 book ai didi

java - 使用 ByteBuddy 在同一个类中检测多个方法

转载 作者:行者123 更新时间:2023-12-04 13:22:19 26 4
gpt4 key购买 nike

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

关于java - 使用 ByteBuddy 在同一个类中检测多个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49189495/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com