我认为这是每个 Java 程序员都会遇到的情况,如果他们做的时间足够长的话。您正在做一些调试并对类进行更改。当您重新运行程序时,这些更改似乎没有被拾取,而是旧类似乎仍在运行。你清理并重建一切,同样的问题。有时,这可能归结为类路径问题,即同一个类不止一次在类路径上,但似乎没有一种简单的方法可以确定正在加载的类的来源......
有没有办法找到加载的类的文件路径?如果该类是从.class
文件或.jar
文件加载的,则最好使用可以工作的东西。有任何想法吗?
我认为这是每个 Java 程序员都会遇到的情况,如果他们做的时间足够长的话。您正在做一些调试并对类进行更改。当您重新运行程序时,这些更改似乎没有被拾取,而是旧类似乎仍在运行。你清理并重建一切,同样的问题。有时,这可能归结为类路径问题,即同一个类不止一次在类路径上,但似乎没有一种简单的方法可以确定正在加载的类的来源......
有没有办法找到加载的类的文件路径?如果该类是从.class
文件或.jar
文件加载的,则最好使用可以工作的东西。有任何想法吗?
如果您想从应用程序内部以编程方式执行此操作,请尝试:
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
由于类需要来自类路径中的某个位置,我建议简单地打印类路径并检查某处是否有旧版本的类。