有人知道如何通过编程找到java类加载器实际从哪里加载类吗?

我经常在大型项目中工作,其中类路径非常长,手动搜索实际上不是一个选择。我最近遇到了一个问题,类加载器加载了一个不正确的类版本,因为它位于类路径的两个不同的地方。

那么,如何让类加载器告诉我实际的类文件来自磁盘的哪个位置呢?

编辑:如果类加载器实际上由于版本不匹配(或其他原因)而无法加载类,我们是否可以在它读取文件之前找到它试图读取的文件?


当前回答

简单的方法:

System.out.println (java.lang.String.class.getResource (String.class.getSimpleName () + " . class "));

例子:

jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class

Or

String obj = "简单测试"; System.out.println (obj.getClass () .getResource (obj.getClass () .getSimpleName () + " . class "));

例子:

jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class

其他回答

getClass().getProtectionDomain().getCodeSource().getLocation();

这里有一个例子:

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

另一种查找类从何处装入的方法(无需操作源)是使用选项:-verbose:class启动Java VM

只编辑第一行: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/

也许是糟糕的风格,但很好!

简单的方法:

System.out.println (java.lang.String.class.getResource (String.class.getSimpleName () + " . class "));

例子:

jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class

Or

String obj = "简单测试"; System.out.println (obj.getClass () .getResource (obj.getClass () .getSimpleName () + " . class "));

例子:

jar:文件:/ D: / Java / jdk1.8 / jre / lib / rt.jar ! / Java / lang / String.class