【问题标题】:Where on the file system was my Java class loaded from?我的 Java 类是从文件系统的哪个位置加载的?
【发布时间】:2010-10-21 05:57:03
【问题描述】:

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

有没有办法找到加载的类的文件路径?如果该类是从.class 文件或.jar 文件加载的,则最好使用可以工作的东西。有什么想法吗?

【问题讨论】:

标签: java debugging classloader


【解决方案1】:

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

【讨论】:

  • 实际上,任何 JVM,因为 -verbose 是必需的标志,不是吗。取决于供应商的是 -X 标志。
【解决方案2】:

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

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

(注意,getCodeSource() 可能会返回 null,所以实际上不要在一行中完成所有这些操作 :))

【讨论】:

  • getProtectionDomain 也可能返回 null(通常用于引导类)。我的问题是,如果没有显示更改,您如何运行此代码? :)
【解决方案3】:
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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 其实,不再如此。有系统类,扩展目录(是的,复数),动态可扩展类加载器(ala URLClassLoader)。这些天来,这个类的实际来源可能相当复杂。
    • 如何打印类路径?您提供的链接已损坏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 2015-01-04
    • 2019-04-07
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    相关资源
    最近更新 更多