【问题标题】:ClassLoader.getSystemResourceAsStream(className) returning null when trying to load class file resourceClassLoader.getSystemResourceAsStream(className) 在尝试加载类文件资源时返回 null
【发布时间】:2011-10-13 00:55:08
【问题描述】:
Class clazz = ...;
InputStream is = ClassLoader.getSystemResourceAsStream(clazz.getName().replace('.', '/') + ".class");

输入流返回 null。我使用了一个简单的 java 检测代理来记录加载类时的类,并且类(clazz)肯定是由 ClassLoader 加载的。我也试过了

... Thread.currentThread().getContextClassLoader().getResourceAsStream(...));

它也返回null。类加载器无法找到资源的一些可能原因是什么?

【问题讨论】:

    标签: java class resources classloader


    【解决方案1】:

    该类显然是由不同的 ClassLoader 加载的,而不是您尝试使用的 ClassLoader。试试这个:

    InputStream is = clazz.getClassLoader().getResourceAsStream(
        clazz.getName().replace('.', '/') + ".class");
    

    JVM 中的一个缺陷,我认为不可能返回 null。

    【讨论】:

    • 我刚刚尝试过,仍然无法找到类文件。问题可能是我添加类的 jar 被不同的 jar 使用(不同的 jar 包含主类)?
    • 不,jar 与此无关,除非它们是 OSGi 包。你在什么样的环境中运行它?你能提供一个SSCCE吗?
    • 抱歉,您的建议最终解决了无法将类文件作为资源加载的问题。现在我遇到了一个不同的问题,即 NoClassDefFoundError 由对 ClassLoader.defineClass(...) 的反射调用引发,因为它无法找到我试图作为资源加载的同一个类。跨度>
    • 很明显,您至少有两个 ClassLoader 有不同的类可供它们使用,并且它会弄乱您正在做的任何事情。我建议发布另一个问题,对您要完成的工作进行更完整的解释。也许有人可以提出一个更适合您的替代方案。
    【解决方案2】:

    你试过 getClass().getClassLoader().getResourceAsStream() 请确保您要在代码的类路径中加载的类文件。 你也可以分享一下 clazz.getName() 的值吗?

    编辑:

    你在做类似以下的事情吗?

    Class clazz = Dummy.class;
    InputStream is = ClassLoader.getSystemResourceAsStream(clazz.getName().replace('.', '/') + ".class");
    

    我的意思是说,您是否将 clazz 定义为 ClassName.class ?如果没有,请尝试执行此操作,然后查看。

    【讨论】:

    • 我没试过,我会告诉你结果的。我假设类文件位于类路径中,因为当我使用 java 代理调试类的加载时,我会在调试日志中看到我试图获取的类的名称作为资源输出。 clazz.getName() 的值为“com.example.MyClass”
    • 您可以尝试在 clazz.getName().replace('.', '/') + ".class" 前添加反斜杠 (/) 并尝试
    • 试过没有用。问题可能是该类位于一个用作主应用程序库的 jar 中吗?这很令人困惑,因为我能够在代码中引用该类,但是当我尝试将文件作为资源加载时却找不到它。
    猜你喜欢
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多