簡體   English   中英

未調用使用 ByteBuddy AgentBuilder 添加的建議

[英]Advice added using ByteBuddy AgentBuilder is not getting invoked

我試圖在我的應用程序中添加一個建議,以便在執行流程期間調用方法 CassandraFunctions.loadObjectByKey 時調用 onEnter 和 onExit。 我使用下面的代碼來注冊建議。

protected void instrument(boolean t) {

    Instrumentation instrument = null;
    // Get loader initialized in premain class
    try {
        Class<?> c = Class.forName("my.loader.InstrumentLoader");
        java.lang.reflect.Method m = c.getMethod("getInstrument");
        instrument = (Instrumentation) m.invoke(null);
    } catch (Exception e) {
        e.printStackTrace();
    }

    if(instrument == null) {
        return;
    }
    
    // Add an advice 
    String clzName = CassandraFunctionsAdvice.class.getName();
    new AgentBuilder.Default()
.with(AgentBuilder.RedefinitionStrategy.RETRANSFORMATION)
.type(ElementMatchers.named("my.functions.CassandraFunctions"))
        .transform( 
                new AgentBuilder.Transformer.ForAdvice()
                    .include(Class.class.getClassLoader())
                    .advice(ElementMatchers.named("loadObjectByKey"), clzName))
        .installOn(instrument);
}

建議 class 如下所示:

public class CassandraFunctionsAdvice {

    @Advice.OnMethodEnter
    public static void onEnter(@Advice.Argument(0) String key) {

        String debugText = "OnMethodEnter|loadObjectByKey|key=" + key;
        System.out.println(debugText);
    }

    @Advice.OnMethodExit
    public static void onExit(@Advice.Thrown Throwable throwable) {
        String debugText = "OnMethodExit|loadObjectByKey";
        System.out.println(debugText);
    }
}

正在檢測的 class 如下所示:

public class CassandraFunctions {
    public static Object loadObjectByKey(String key) {
        ....
        return object;
    }
}

檢測的 class my.functions.CassandraFunctions 在用戶請求調用 function loadObjectByKey 之前加載。 我不確定缺少什么以及為什么沒有調用建議。

我已經回答了您關於 GitHub 問題的問題

建議代碼只是一個模板。 一旦 Byte Buddy 內聯私有字段,代碼就看不到它。

您需要問自己的問題是:我可以將此代碼復制粘貼到目標 class 並且它仍然可以編譯嗎? 如果不是,那么你需要改變你的建議。 如果要管理共享 state,則需要將其移動到 class 可訪問的 class 加載程序並將其注入適當的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM