簡體   English   中英

如何列出特定類加載器中加載的所有類

[英]How can I list all classes loaded in a specific class loader

出於調試原因和好奇心,我希望列出加載到特定類加載器的所有類。

看到類加載器的大多數方法都受到保護,實現我想要的最佳方法是什么?

謝謝!

試試這個。 這是一個黑客的解決方案,但它會做。

任何類加載器中的字段classes (在1.0之后的Sun的impl下)都保存了對加載器定義的類的硬引用,因此它們不會是GC。 您可以從via反射中獲益。

Field f = ClassLoader.class.getDeclaredField("classes");
f.setAccessible(true);

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
Vector<Class> classes =  (Vector<Class>) f.get(classLoader);

Instrumentation.getInitiatedClasses(ClassLoader)可以做你想要的。

根據文件:

返回所有類的數組,其中loader是啟動加載器。

我不確定“啟動裝載機”是什么意思。 如果沒有給出正確的結果,請嘗試使用getAllLoadedClasses()方法並通過ClassLoader手動過濾。


如何獲得Instrumentation的實例

只有代理JAR(與應用程序JAR分開)才能獲得Instrumentation接口的實例。 使應用程序可用的一種簡單方法是創建一個代理JAR,其中包含一個具有premain方法的類,該方法除了保存對系統屬性中Instrumentation實例的引用外什么都不做。

示例代理類:

public class InstrumentHook {

    public static void premain(String agentArgs, Instrumentation inst) {
        if (agentArgs != null) {
            System.getProperties().put(AGENT_ARGS_KEY, agentArgs);
        }
        System.getProperties().put(INSTRUMENTATION_KEY, inst);
    }

    public static Instrumentation getInstrumentation() {
        return (Instrumentation) System.getProperties().get(INSTRUMENTATION_KEY);
    }

    // Needn't be a UUID - can be a String or any other object that
    // implements equals().    
    private static final Object AGENT_ARGS_KEY =
        UUID.fromString("887b43f3-c742-4b87-978d-70d2db74e40e");

    private static final Object INSTRUMENTATION_KEY =
        UUID.fromString("214ac54a-60a5-417e-b3b8-772e80a16667");

}

示例清單:

Manifest-Version: 1.0
Premain-Class: InstrumentHook

然后,應用程序將引用生成的JAR, 在啟動應用程序時在命令行(使用-javaagent選項)中指定。 它可能在不同的ClassLoader加載兩次,但這不是問題,因為系統Properties是每進程單例。

示例應用程序類

public class Main {
    public static void main(String[] args) {
        Instrumentation inst = InstrumentHook.getInstrumentation();
        for (Class<?> clazz: inst.getAllLoadedClasses()) {
            System.err.println(clazz.getName());
        }
    }
}

暫無
暫無

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

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