我正在嘗試在 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
提交
取消