簡體   English   中英

ClassTransformer沒有執行

[英]ClassTransformer not executing

使用案例

我正在嘗試編寫Java SE8 ClassFileTransformer實現。 這個目標是調試。 我很清楚BTrace,但它並不適合我正在嘗試做的事情。 那是什么,是內部方法水平檢查。 BTrace將其斷點限制為進入/退出。 我想了解一下這個細節。

所以我想我現在用ASM做這件事現在很難嗎?

ASM是ByteBuddy和BTrace使用的字節代碼操作庫)


問題

所以我開始定義一個簡單的ClassFileTransformer

public class PreMainInjection {
    public static void premain(String agentArgs,
          Instrumentation inst) {
        inst.addTransformer(new EntryPoint(), true);
    }
}

public class EntryPoint implements ClassFileTransformer {
    public EntryPoint() { }
    @Override
    public byte[] transform(ClassLoader classloader, String name, 
           Class<?> clazz, ProtectionDomain prot, byte[] data) {
       System.out.printf("Loaded: %s\n", name);
    }
}

這非常有效:DI看到所有類的列表作為我正在檢查的應用程序開始。

所以現在我帶來了ASM。

public class PreMainInjection {
    public static void premain(String agentArgs,
          Instrumentation inst) {
        inst.addTransformer(new EntryPoint(), true);
    }
}

public class EntryPoint implements ClassFileTransformer {
    public EntryPoint() { }
    @Override
    public byte[] transform(ClassLoader classloader, String name, 
           Class<?> clazz, ProtectionDomain prot, byte[] data) {
       ClassReader reader = new ClassReader(bytes);
       ClassNode node = new ClassNode();
       ClassWriter writer = new ClassWriter(
           ClassWriter.COMPUTE_FRAMES|ClassWriter.COMPUTE_MAXS);
       reader.accept(node, ClassReader.EXPAND_FRAMES);
       System.out.printf("Name: %s", node.name);
       node.accept(writer);
       return writer.toByteArray();
    }
}

這有效...到目前為止我的應用程序沒有中斷。 但我從來沒有看到過單一的調試輸出。

那么發生了什么?

如果我的經紀人剛才進一步擴展

 System.out.printf("Loaded %s\n", name);
 return null;

該應用程序仍然有效,我可以看到輸出。 所以我很困惑。

回答你的第一個問題ASM有多難:非常難。

要達到您的實際要點:您可能在到達打印輸出之前遇到異常。 對於類文件轉換器,如果它們轉義transform方法,則會禁止異常。 您是否嘗試將代碼包裝在try-catch塊中以查看是否引發了異常?

您也有可能沒有將ASM與您的代理捆綁在一起。 在這種情況下,在變換器執行期間會出現錯誤而不是異常。 最后,我會嘗試你的代理沒有幀計算,因為這需要訪問所有引用的類文件,這也可能是問題的根源。

所以我似乎遇到了一個奇怪的邊緣情況

只有在完成ClassReader訪問后, ClassNode的內部字段才會被實例化。 在這種情況下,它是靜態可證明的System.out.printf("Name: %s", node.name); 將始終在編譯時返回NullPointerException

所以我認為JVM根本不加載我的ClassFileTransformer

無論哪種方式,我都有系統工作。

暫無
暫無

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

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