我實(shí)際上正在用 ByteBuddy API 編寫一個(gè) Java 代理,我需要在其中監(jiān)視一些方法。比方說(shuō)我需要記錄一個(gè)方法的執(zhí)行時(shí)間。這是我的代碼: public class PerfAgents { public static void premain(String agentArgs, Instrumentation inst){ LOGGER.info("[Agent] Loading classes ..."); Class classToMonitor = getClassFromArgs(agentArgs); String methodToMonitor = getMethodFromArgs(agentArgs); installAgent(inst, classToMonitor, methodToMonitor); } private static void installAgent(Instrumentation instrumentation, Class<?> classToMonitor, String methodToMonitor) { new AgentBuilder.Default() .type(is(classToMonitor)) .transform((builder, typeDescription, classLoader, module) -> { LOGGER.info("Transforming {} for {}", method, classToMonitor.getSimpleName()); return builder.method(named(methodToMonitor)) .intercept(MethodDelegation.to(TimerInterceptor.class)); }).installOn(instrumentation); }}這TimerInterceptor類似于LoggerInterceptor我在 ByteBuddy 教程中找到的,我在其中使用了@SuperCall注釋。問(wèn)題不是我不確定 ByteBuddy 是否將轉(zhuǎn)換應(yīng)用于提供的類和方法。我可以看到代理正在我的應(yīng)用程序中加載,但是當(dāng)我執(zhí)行我的監(jiān)控方法時(shí),沒(méi)有任何反應(yīng)。這是我的 TimerInterceptor 類:static class TimerInterceptor { private static Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class); public static Object log(@SuperCall Callable<Object> callable) throws Exception { LocalTime start = LocalTime.now(); Object called = callable.call(); LocalTime end = LocalTime.now(); Duration between = Duration.between(start, end); LOGGER.info("Execution time : {} ms", between.toMillis()); return called; }}任何幫助,將不勝感激。
1 回答

慕標(biāo)琳琳
TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
您沒(méi)有將 Byte Buddy 配置為重新轉(zhuǎn)換已加載的類。.with(RetransformationStrategy.RETRANSFORM)
您可以通過(guò)在代理構(gòu)建器 DSL 中進(jìn)行設(shè)置來(lái)實(shí)現(xiàn)。
如果您可以避免重新轉(zhuǎn)換,即如果您只檢測(cè)在執(zhí)行代理時(shí)未加載的應(yīng)用程序類,則可以跳過(guò)此步驟。相反,使用基于字符串的匹配器并且不加載該類。如果需要更豐富的描述,也可以使用aTypePool.Default
讓字節(jié)好友在不加載類的情況下解析類文件。
要查看 Byte Buddy 在做什么,您可以注冊(cè)一個(gè)Listener.StreamWriting.toSystemOut()
所有發(fā)現(xiàn)的類都打印到控制臺(tái)的位置,包括任何潛在的錯(cuò)誤。
添加回答
舉報(bào)
0/150
提交
取消