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

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

有没有办法找到加载的类的文件路径? 如果从.class文件或.jar文件加载类,则.jar 。 有任何想法吗?

只需使用标准命令行开关“ -verbose:class ”运行java (参见java文档 )。 这将在每次加载类时打印出来并告诉您从何处加载。

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

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

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

 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)); } 

示例输出:jar:file:/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Classes/classes.jar!/java/lang/String.class

由于类需要来自类路径中的某个位置,我建议只需打印类路径并检查是否有某个旧版本的类。