亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ByteBuddy:如何在轉換方法時跨進入/退出添加局部變量

ByteBuddy:如何在轉換方法時跨進入/退出添加局部變量

汪汪一只貓 2023-04-13 17:00:12
我正在嘗試在 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 或其他語言意義上的指針語義。如果您想分配spanscope必須在帶注釋的方法本身中這樣做。


查看完整回答
反對 回復 2023-04-13
  • 1 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號