找到加载特定类的ClassLoader

paw*_*que 4 java classloader

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

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

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

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

sgp*_*p15 6

你如何推出你的计划?

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

-verbose:class
Run Code Online (Sandbox Code Playgroud)

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


Tom*_*ine 5

clazz.getProtectionDomain().getCodeSource().getLocation()
Run Code Online (Sandbox Code Playgroud)

明显!(可能是NPE.)

(ClassLoaders可以从多个位置加载类.)