找出Java类加载的位置

215

有没有人知道如何以编程方式找出Java类加载器实际从哪里加载类?

我经常在大型项目上工作,其中类路径变得非常长,手动搜索不是一个真正的选项。 最近,我遇到了一个问题,因为同一类在类路径中存在两个不同的位置,导致类加载器加载了一个错误版本的类。

那么,我怎样才能让类加载器告诉我实际的类文件在磁盘上来自哪里呢?

编辑:如果类加载器由于版本不匹配(或其他原因)而无法加载类,我们是否有办法在读取文件之前找出它尝试读取的文件名?

12个回答

0
这种方法适用于文件和jar包。
Class clazz = Class.forName(nameOfClassYouWant);

URL resourceUrl = clazz.getResource("/" + clazz.getCanonicalName().replace(".", "/") + ".class");
InputStream classStream = resourceUrl.openStream(); // load the bytecode, if you wish

-2
假设你正在使用一个名为MyClass的类,下面的代码应该可以运行:
MyClass.class.getClassLoader();

无论是否可以获取.class文件的磁盘位置都取决于类加载器本身。例如,如果您正在使用类似BCEL的东西,某个类甚至可能没有磁盘表示形式。

这会返回用于加载类的ClassLoader,对吗?它不会找到.class文件的位置吗? - Koray Tugay
1
不,它不能。类加载器实际上可以引用完全不同的类路径 - 这意味着它将完全无法到达实际的类位置。 - Tomáš Zato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接