有没有办法确定哪个ClassLoader加载特定的类?或者更具体地说,从特定类的加载位置?
我的情况是加载旧的db驱动程序类。我想找到加载旧驱动程序的文件。
我最初的方法是在ClassLoader.loadClass(..)方法上设置一个调试点,并在加载类后停止vm,看看哪个类加载器正在加载它。不幸的是,loadClass方法经常被调用,很难在类加载的地方停止。我将尝试设置断点过滤器。但是,还有另一个问题:由于ClassLoader体系结构,即使ClassLoader不负责加载,也会调用loadClass。
必须有更好的方法来实现我想要的。您是否有想法或建议在哪里寻找解决方案?
答案 0 :(得分:6)
你如何推出你的计划?
向命令行添加以下选项记录正在加载的每个类的位置。
-verbose:class
这些日志通常出现在sysout中。但是,根据日志记录的配置方式,您可能需要查看一下。
答案 1 :(得分:5)
clazz.getProtectionDomain().getCodeSource().getLocation()
明显! (可能是NPE。)
(ClassLoader
s可以从多个位置加载类。)
答案 2 :(得分:0)
此命令的-verbose:jni选项将显示加载的类,这些类不是用java编写的,即“java native interface”。
-dbednar