Java 试图加载类文件资源时,ClassLoader.getSystemResourceAsStream(className)返回null

Java 试图加载类文件资源时,ClassLoader.getSystemResourceAsStream(className)返回null,java,class,resources,classloader,Java,Class,Resources,Classloader,输入流正在返回null。我使用了一个简单的java instrumentation代理来记录类的加载过程,类(clazz)肯定是由类加载器加载的。我也试过了 Class clazz = ...; InputStream is = ClassLoader.getSystemResourceAsStream(clazz.getName().replace('.', '/') + ".class"); 它也返回null。类加载器找不到资源的一些可能原因是什么?您是否尝试过getClass().get

输入流正在返回null。我使用了一个简单的java instrumentation代理来记录类的加载过程,类(clazz)肯定是由类加载器加载的。我也试过了

Class clazz = ...;
InputStream is = ClassLoader.getSystemResourceAsStream(clazz.getName().replace('.', '/') + ".class");
它也返回null。类加载器找不到资源的一些可能原因是什么?

您是否尝试过getClass().getClassLoader().getResourceAsStream() 请确保您要加载的类文件位于代码的类路径中。 您还可以共享clazz.getName()的值吗

编辑:

你是在做下面的事情吗

... Thread.currentThread().getContextClassLoader().getResourceAsStream(...));
我的意思是,你把clazz定义为ClassName.class吗?如果没有,请尝试执行此操作,然后查看。

您是否尝试了getClass().getClassLoader().getResourceAsStream() 请确保您要加载的类文件位于代码的类路径中。 您还可以共享clazz.getName()的值吗

编辑:

你是在做下面的事情吗

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

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

该类显然是由不同的类加载器加载的,而不是您试图使用的类加载器加载的。请尝试以下方法:

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

如果JVM中没有缺陷,我认为不可能返回null。

该类显然是由不同的类加载器加载的,而不是您试图使用的类加载器加载的。请尝试以下方法:

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

如果JVM中没有缺陷,我认为不可能返回null。

我还没有尝试过,我会告诉您结果。我假设类文件位于类路径中,因为当我使用java代理调试类的加载时,我会在调试日志中看到我试图作为资源输出获取的类的名称。clazz.getName()的值是“com.example.MyClass”。您可以尝试在clazz.getName()前面加一个反斜杠(/)。替换('.','/')+“.class”,并尝试将其改为无效。问题可能是该类位于用作主应用程序库的jar中吗?这很混乱,因为我可以在代码中引用该类,但当我尝试将该文件作为资源加载时,却找不到它。我还没有尝试过,我会告诉您结果。我假设类文件位于类路径中,因为当我使用java代理调试类的加载时,我会在调试日志中看到我试图作为资源输出获取的类的名称。clazz.getName()的值是“com.example.MyClass”。您可以尝试在clazz.getName()前面加一个反斜杠(/)。替换('.','/')+“.class”,并尝试将其改为无效。问题可能是该类位于用作主应用程序库的jar中吗?这很让人困惑,因为我可以在代码中引用类,但当我尝试将文件作为资源加载时,却找不到它。我只是尝试了一下,但仍然找不到类文件。问题可能是我添加了类的jar正被另一个jar使用(另一个jar包含主类)?不,jar与此无关,除非它们是OSGi包。您在什么样的环境中运行此功能?您能提供一个解决方案吗?很抱歉,您的建议最终解决了类文件无法作为资源加载的问题。现在我遇到了一个不同的问题,对ClassLoader.defineClass(…)的反射调用引发了一个NoClassDefFoundError,因为它无法找到我试图加载为资源的同一个类。很明显,至少有两个类加载器具有不同的可用类,不管你在做什么,它都在捣乱。我建议发布另一个问题,更完整地解释你想要实现的目标。也许有人可以建议一个更适合你的替代方案。我只是尝试了一下,但是仍然找不到类文件。问题可能是我添加了类的jar正被另一个jar使用(另一个jar包含主类)?不,jar与此无关,除非它们是OSGi包。您在什么样的环境中运行此功能?您能提供一个解决方案吗?很抱歉,您的建议最终解决了类文件无法作为资源加载的问题。现在我遇到了一个不同的问题,对ClassLoader.defineClass(…)的反射调用引发了一个NoClassDefFoundError,因为它无法找到我试图加载为资源的同一个类。很明显,至少有两个类加载器具有不同的可用类,不管你在做什么,它都在捣乱。我建议发布另一个问题,更完整地解释你想要实现的目标。也许有人可以建议一个对你更有效的替代方案。