我正在尝试在 Java 代理中使用ByteBuddy来检测一些使用OpenTracing 的旧库。这与OpenTracing Contrib Java Special Agent 项目有关。当使用私有类成员传递活动范围时,我成功地完成了这项工作,但不幸的是,在某些情况下这是不可行的(错误处理清除了成员字段)。所以我试图使用 ByteBuddy 的能力来创建可以从@Advice.OnMethodEnter保留到@Advice.OnMethodExit的局部变量。这将允许我在方法进入时创建 OpenTracing Span,并在方法退出时完成它。不过,我不确定我的用例是否有效,因为我使用的是转换器,它与@Advice.Local注释的测试用例不完全匹配。我尝试遵循此测试用例中使用的语法。但是,span 和 scope 变量在 exit 方法中始终为 null。我是 ByteBuddy 的新手,所以我确定我缺少一些基本的东西。public class SimpleFrameworkDispatcherAgentRule extends AgentRule { @Override public Iterable<? extends AgentBuilder> buildAgent(AgentBuilder agentBuilder) { return Arrays.asList(agentBuilder .type(named("org.simpleframework.http.core.Dispatcher")) .transform((builder, typeDescription, classLoader, module) -> { return builder.visit(Advice.to(SimpleFrameworkDispatcherAgentRule.class) .on(named("dispatch"))); })); } @Advice.OnMethodEnter public static void enter(final @Advice.Origin String origin, final @FieldValue(value = "request", typing = Typing.DYNAMIC) Object request, final @Advice.Local("span") Object span, final @Advice.Local("scope") Object scope) { if (isEnabled(origin)) { SimpleFrameworkAgentIntercept.enter(request, span, scope); } } @Advice.OnMethodExit public static void exit(final @Advice.Origin String origin, final @FieldValue(value = "response", typing = Typing.DYNAMIC) Object response, final @Advice.Local("span") Object span, final @Advice.Local("scope") Object scope) { if (isEnabled(origin)) { SimpleFrameworkAgentIntercept.exit(response, span, scope); } }}我对 SimpleFrameworkAgentIntercept 进入和退出方法进行了检测,并确认变量在进入时已分配,但在退出时为空。
1 回答
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
您必须分配变量,如果您在委托方法中执行此操作则无济于事。
Byte Buddy 使用建议代码作为模板,其中特定方法中局部变量的任何赋值都被转换为对内联字节代码中检测的局部变量的访问。
Java 没有 C 或其他语言意义上的指针语义。如果您想分配span
或scope
必须在带注释的方法本身中这样做。
添加回答
举报
0/150
提交
取消