繁体   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