找到加载特定类的ClassLoader

有没有办法确定哪个ClassLoader加载特定的类? 或者更具体地说,从特定类的加载位置?

我有一个加载旧的db驱动程序类的情况。 我想找到加载旧驱动程序的文件。

我最初的方法是在ClassLoader.loadClass(..)方法上设置一个调试点,并在加载类后停止vm以查看哪个类加载器正在加载它。 不幸的是,loadClass方法经常被调用,很难在类加载的地方停止。 我将尝试设置断点filter。 但是,还有另一个问题:由于ClassLoader体系结构,即使ClassLoader不负责加载,也会调用loadClass。

必须有更好的方法来实现我想要的。 您是否有想法或建议在哪里寻找解决方案?

你如何推出你的计划?

向命令行添加以下选项会记录正在加载的每个类的位置。

-verbose:class 

这些日志通常出现在sysout中。 但是根据日志记录的配置方式,您可能需要稍微查看一下。

 clazz.getProtectionDomain().getCodeSource().getLocation() 

明显! (可能是NPE。)

ClassLoader可以从多个位置加载类。)

此外,java命令的-verbose:jni选项将显示未加载的类,即“java native interface”。

-dbednar