当前位置: 首页 > 面试题库 >

如何列出特定类加载器中加载的所有类

柯苗宣
2023-03-14
问题内容

出于调试原因和好奇心,我希望列出所有加载到特定类加载器的类。

鉴于类加载器的大多数方法都受到保护,实现我想要的最佳方法是什么?

谢谢!


问题答案:

[Instrumentation.getInitiatedClasses(ClassLoader)](http://java.sun.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getInitiatedClasses\(java.lang.ClassLoader\))
可以做你想要的。

根据文档:

返回所有类的数组,这些类的加载程序是初始加载程序。

我不确定“启动加载程序”是什么意思。如果这样不能给出正确的结果,请尝试使用该getAllLoadedClasses()方法并通过ClassLoader手动进行过滤。

如何获得的实例Instrumentation

只有代理JAR(与应用程序JAR分开)可以获取Instrumentation接口的实例。使它可用于应用程序的一种简单方法是使用一种premain方法将其创建为包含一个类的代理JAR,该方法除了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选项)上指定结果。它可能在不同的ClassLoaders中加载了两次,但这不是问题,因为系统Properties是按进程的单例。

示例应用程序类

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


 类似资料:
  • 想知道在StanfordCorenlp中是否有一种方法来加载特定的分类器。我试图解决一个问题,其中3个分类器在默认情况下被加载,第三个分类器不可靠地返回ner标记,并导致应用程序中的不一致性。想知道加载English.all.3Class对于基本的命名实体标记足够好,以及下面列表中其他两个的相关性是什么。 edu/stanford/nlp/models/ner/english.all.3class

  • 我试图修改几个类的字节代码,这些类的打包jar文件不在类路径中-它们是在给定URL的运行时由自定义的加载的。我尝试使用和来拦截那些类,但失败了。类加载器是遗留项目的一部分,因此我无法直接对其进行更改。 代理可以很好地处理AppClassLoader“本地”加载的类,但只会忽略那些由自定义类加载器加载的类。 CustomClassLoader: 我的代理中使用的ClassFileTransforme

  • 我在部署一个使用部署系统注入的SPI实现的Quarkus应用程序时遇到了一个问题。 感兴趣的事情: null

  • 我试图在laravel中热切地加载一个模型,但只返回某些列。我不希望整个热切加载表被提出。

  • 问题内容: 我想获得属于某个包的所有类及其所有子级的列表。这些类可能已经或可能尚未加载到JVM中。 问题答案: 这不是编程解决方案,但你可以运行 然后JVM会丢弃它正在加载的内容以及从何处卸载。

  • 框架中所有的类都是通过类加载器(ClassLoader)加载的,通过Loader我们可以实现类的统一管理。下面我们一起来看看Loader提供了哪些加载方法: 1. Loader::import 加载一个类或者加载一个包 方法原型 import( $classPath, $type = IMPORT_APP, $extension=EXT_PHP ) 参数名称 参数说明 $classPath 文件的