gpt4 book ai didi

java - 字节好友 : how to add local variable across enter/exit when transforming a method

转载 作者:行者123 更新时间:2023-11-30 01:48:09 25 4
gpt4 key购买 nike

我正在尝试在 Java 代理中使用 ByteBuddy 来使用 OpenTracing 检测一些较旧的库。这与OpenTracing Contrib Java Special Agent project相关联。 。当使用私有(private)类成员传递 Activity 范围时,我成功地实现了这一点,但不幸的是,在某些情况下这是不可行的(错误处理会清除成员字段)。

因此,我尝试使用 ByteBuddy 的功能来创建可以从 @Advice.OnMethodEnter@Advice.OnMethodExit 保留的局部变量。这将允许我在方法输入时创建 OpenTracing Span,并在方法退出时完成它。不过,我不确定我的用例是否有效,因为我使用的是变压器,它与 @Advice.Local 注释的测试用例不完全匹配。

我尝试遵循 this test case 中使用的语法.

但是,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 的进入和退出方法,并确认变量在进入时已分配,但在退出时为 null。

最佳答案

您必须分配变量,如果您在委托(delegate)方法中执行此操作,则没有帮助。

Byte Buddy 使用建议代码作为模板,其中特定方法中局部变量的任何赋值都会转换为对内联字节代码中检测的局部变量的访问。

Java 没有 C 或其他语言意义上的指针语义。如果您想分配 spanscope,您必须在带注释的方法本身中执行此操作。

关于java - 字节好友 : how to add local variable across enter/exit when transforming a method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57167773/

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