我正在嘗試在 Java 代理中使用ByteBuddy來(lái)檢測(cè)一些使用OpenTracing 的舊庫(kù)。這與OpenTracing Contrib Java Special Agent 項(xiàng)目有關(guān)。當(dāng)使用私有類(lèi)成員傳遞活動(dòng)范圍時(shí),我成功地完成了這項(xiàng)工作,但不幸的是,在某些情況下這是不可行的(錯(cuò)誤處理清除了成員字段)。所以我試圖使用 ByteBuddy 的能力來(lái)創(chuàng)建可以從@Advice.OnMethodEnter保留到@Advice.OnMethodExit的局部變量。這將允許我在方法進(jìn)入時(shí)創(chuàng)建 OpenTracing Span,并在方法退出時(shí)完成它。不過(guò),我不確定我的用例是否有效,因?yàn)槲沂褂玫氖寝D(zhuǎn)換器,它與@Advice.Local注釋的測(cè)試用例不完全匹配。我嘗試遵循此測(cè)試用例中使用的語(yǔ)法。但是,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); } }}我對(duì) SimpleFrameworkAgentIntercept 進(jìn)入和退出方法進(jìn)行了檢測(cè),并確認(rèn)變量在進(jìn)入時(shí)已分配,但在退出時(shí)為空。
1 回答

素胚勾勒不出你
TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
您必須分配變量,如果您在委托方法中執(zhí)行此操作則無(wú)濟(jì)于事。
Byte Buddy 使用建議代碼作為模板,其中特定方法中局部變量的任何賦值都被轉(zhuǎn)換為對(duì)內(nèi)聯(lián)字節(jié)代碼中檢測(cè)的局部變量的訪問(wèn)。
Java 沒(méi)有 C 或其他語(yǔ)言意義上的指針語(yǔ)義。如果您想分配span
或scope
必須在帶注釋的方法本身中這樣做。
添加回答
舉報(bào)
0/150
提交
取消