2012-03-15 52 views
4

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

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

我最初的方法是设置在ClassLoader.loadClass(..)方法调试点,一旦类是越来越加载,看看哪个类加载器加载它停止虚拟机。不幸的是,loadClass方法经常被调用,以至于难以停止加载类。我会尝试设置一个断点过滤器。但是,还有一个问题:由于ClassLoader体系结构的原因,即使ClassLoader不负责加载,也会调用loadClass。

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

回答

6

你如何启动你的程序?

添加以下选项的命令行记录被加载的每个类的位置。

-verbose:class 

这些日志通常出现在sysout中。但取决于如何配置日志,您可能不得不环顾一下。

+0

很好的答案。两个答案都很棒,我应该把哪一个作为一个? – paweloque 2012-03-15 14:47:57

+0

@ sgp15,有没有办法以编程方式获取ClassLoader实例在运行时加载特定的类?谢谢。 – suat 2012-05-17 14:42:34

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

明显! (五月NPE)

+0

很好的答案。两个答案都很棒,我应该把哪一个作为一个? – paweloque 2012-03-15 14:47:01

0

另外,-verbose(ClassLoader S可从多个位置加载类。):java命令的JNI选项将显示加载的类未用Java编写的,即“Java本地接口”。

-dbednar