繁体   English   中英

有没有办法让ClassLoader加载哪些类?

[英]Is there a way to get which classes a ClassLoader has loaded?

我正在尝试为旧框架实现一些单元测试。 我试图模拟出数据库层。 不幸的是,我们的框架有点陈旧,并没有完全采用最佳实践,因此没有明确的关注点分离。 我有点担心试图模拟数据库层可能会使JVM加载大量甚至无法使用的类。

我不太了解类加载器,所以这可能不是问题。 有没有办法在特定ClassLoader加载的所有类中达到峰值,以证明引擎盖下发生了什么?

您可以创建自己的类加载器并在单元测试期间使用它加载。 让自己的自定义类加载器打印出它正在做的事情。

或者,如果您只想知道加载了哪些类,请执行以下操作:

java -verbose:class

请注意使用

java -verbose

会产生大量的输出。 将输出记录到文件,然后使用grep。 如果你有'tee'过滤器,你可以试试这个:

java -verbose | tee classloader.log
grep class classloader.log

我不确定。 但有一种方法我认为可以做到。 虽然这可能太荒谬了。 您可以尝试方面并为loadclass设置切入点。 也许jvm参数-verbose可能有用。

作为替代方法,对于您提到的特定类加载器,您可以使用此代码段。 如果需要,只需更改obj变量的值即可。

Object obj = this;
ClassLoader classLoader = obj.getClass().getClassLoader();
File file = new File("classloderClasses.txt");
if (file.exists()) {
    file.delete();
}
if (classLoader != null) {
    try {
        Class clClass = classLoader.getClass();
        while (clClass != ClassLoader.class) {
            clClass = clClass.getSuperclass();
        }
        java.lang.reflect.Field classesField = clClass.getDeclaredField("classes");
        classesField.setAccessible(true);
        Vector classes = (Vector) classesField.get(classLoader);
        FileOutputStream fos = new FileOutputStream("classloderClasses.txt", true);
        fos.write(("******************** " + classLoader.toString() + " ******************** " + "\n").getBytes());
        fos.write(Arrays.toString(classes.toArray()).getBytes());
        fos.close();
    } catch (Exception exception) {
        exception.printStackTrace();
        // TODO
    }
}

您可以使用-Xlog选项配置或启用Java虚拟机(JVM)统一日志记录框架的日志记录。 优点是您可以将结果写入文本文件

概要

-Xlog[:[what][:[output][:[decorators][:output-options [,...]]]]]

在Unified Logging语法中, -verbose:class equals -Xlog:class+load=info

例如

java -Xlog:class+load=info:classloaded.txt

Ocarle doc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM