代码之家  ›  专栏  ›  技术社区  ›  shsteimer

文件系统是从哪里加载的Java类?

  •  23
  • shsteimer  · 技术社区  · 15 年前

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

    有没有办法找到加载的类的文件路径?如果类是从 .class 文件或 .jar 文件。有什么想法吗?

    4 回复  |  直到 8 年前
        1
  •  28
  •   Joachim Sauer    13 年前

    简单运行 java 使用标准命令行开关” -verbose:class “(见) the java documentation )每次加载类时,它都会打印出来,并告诉您从何处加载类。

        2
  •  14
  •   Chris Thornhill    15 年前

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

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

    (注意,getcodesource()可能返回空值,因此不要在一行中全部执行此操作:)

        3
  •  5
  •   avalys    15 年前
    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;
    }
    

    只需将它粘贴到某个地方,并将它传递给要查找其定义的类的类对象。不管从何处调用,它都应该工作,因为它对正在搜索的类调用getresource()。

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

    样品输出: jar:file:/system/library/frameworks/javavm.framework/versions/1.6.0/classes/classes.jar!/Java/Lang/ String.class

        4
  •  0
  •   lothar    15 年前

    由于类需要来自类路径中的某个位置,因此我建议 print the class path 并检查是否在某个地方有一个旧版本的你的类。