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

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

無法使用 ByteBuddy Agent 轉換類

無法使用 ByteBuddy Agent 轉換類

富國滬深 2023-06-14 16:15:29
我實際上正在用 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()所有發現的類都打印到控制臺的位置,包括任何潛在的錯誤。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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