文件系统上的哪个地方是我的Java类加载的?

时间:2009-04-22 23:22:54

标签: java debugging classloader

我认为这是每个Java程序员遇到的情况,如果他们做得足够长的话。您正在进行一些调试并对课程进行更改。当你重新运行程序时,这些更改似乎没有被提取,而是旧的类似乎仍在运行。你清理和重建一切,同样的问题。有时,这可以归结为类路径问题,同一个类在类路径上不止一次,但似乎没有一种简单的方法来确定加载的类来自哪里......

有没有办法找到已加载的类的文件路径?如果从.class文件或.jar文件加载类,则可以使用的优先级。任何想法?

4 个答案:

答案 0 :(得分:28)

只需使用标准命令行开关“java”运行-verbose:class(请参阅the java documentation)。每次加载一个类时都会打印出来并告诉你从哪里加载它。

答案 1 :(得分:14)

如果您想从应用程序内部以编程方式执行此操作,请尝试:

URL loc = MyClass.class.getProtectionDomain().getCodeSource().getLocation();

(注意,getCodeSource()可能会返回null,所以不要在一行中实际执行此操作:))

答案 2 :(得分:5)

public static URL getClassURL(Class klass) {
    String name = klass.getName();
    name = "/" + convertClassToPath(name);
    URL url = klass.getResource(name);
    return url;
}

public static String convertClassToPath(String className) {
    String path = className.replaceAll("\\.", "/") + ".class";
    return path;
}

只需将其粘贴到某处,并将其传递给要查找其定义的类的Class对象。它应该工作,无论它从哪里调用,因为它在被搜索的类上调用getResource()。

public static void main(String[] args) {
    System.out.println(getClassURL(String.class));       
}

示例输出:     罐子:文件:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar /java/lang/String.class

答案 3 :(得分:0)

由于课程需要来自课程路径中的某个地方,我建议您只需print the class path并检查某个地方是否有旧版本的课程。