有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
有人知道如何通过编程找到java类加载器实际从哪里加载类吗?
我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。
那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?
编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?
当前回答
这里有一个例子:
package foo;
public class Test
{
public static void main(String[] args)
{
ClassLoader loader = Test.class.getClassLoader();
System.out.println(loader.getResource("foo/Test.class"));
}
}
这打印出来:
file:/C:/Users/Jon/Test/foo/Test.class
其他回答
这是我们使用的:
public static String getClassResource(Class<?> klass) {
return klass.getClassLoader().getResource(
klass.getName().replace('.', '/') + ".class").toString();
}
这取决于ClassLoader的实现: .getLocation .getCodeSource .getProtectionDomain getClass () () () ()
只编辑第一行:Main.class
Class<?> c = Main.class;
String path = c.getResource(c.getSimpleName() + ".class").getPath().replace(c.getSimpleName() + ".class", "");
System.out.println(path);
输出:
/C:/Users/Test/bin/
也许是糟糕的风格,但很好!
通常情况下,我们不会使用硬编码。我们可以先获取className,然后使用ClassLoader获取类URL。
String className = MyClass.class.getName().replace(".", "/")+".class";
URL classUrl = MyClass.class.getClassLoader().getResource(className);
String fullPath = classUrl==null ? null : classUrl.getPath();
getClass().getProtectionDomain().getCodeSource().getLocation();
另一种查找类从何处装入的方法(无需操作源)是使用选项:-verbose:class启动Java VM