我實際上正在用 ByteBuddy API 編寫一個 Java 代理,我需要在其中監視一些方法。比方說我需要記錄一個方法的執行時間。這是我的代碼: 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注釋。問題不是我不確定 ByteBuddy 是否將轉換應用于提供的類和方法。我可以看到代理正在我的應用程序中加載,但是當我執行我的監控方法時,沒有任何反應。這是我的 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 回答

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