Java:为什么返回null?

3

这段代码返回了空 InputStream 和空 URL。为什么会这样?我有自己的类,想要获取该类的实际 .class 文件作为 InputStream,以便将其序列化为字节数组。

Class clazz = String.class;

String className = clazz.getName(); System.out.println(className);
URL url = clazz.getResource(className);
if( url != null )
{
  String pathName = url.getPath(); System.out.println(className);
}

InputStream inputStream = clazz.getResourceAsStream(className);
if(inputStream != null )
{
  System.out.println(inputStream.available());
}

Java类文件和java.lang.Class的副本 - Donnie
@Donnie:请注意,ChssPly76给我的答案实际上是错误的。 - sivabudh
2个回答

3

首先,您需要获取上下文的类加载器。其次,您需要将类名中的点.替换为斜杠/,并添加.class扩展名以识别实际路径。

因此,以下代码应该可以正常工作:

String name = String.class.getName().replace(".", "/") + ".class";
URL url = Thread.currentThread().getContextClassLoader().getResource(name);
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(name);

编辑:我应该补充说明,inputStream.available()不是了解文件大小的正确方法。它只返回可以读取的字节数,且不会阻塞。换句话说,返回值永远不能被视为一致的。如果您想获取实际长度,确实需要读取整个流。


复制,粘贴,测试 -> 成功了!三个词:你太棒了。谢谢! - sivabudh
哦,谢谢你告诉我还有available()这个方法!我以为available()是.class文件的大小。再次感谢你提供的详细信息! - sivabudh
2
+1,虽然更简单的方法(我本来想在另一个问题中写但出错了)是使用 clazz.getResourceAsStream(clazz.getSimpleName() + ".class") - ChssPly76

0
首先,我不确定您是否可以将实际的 .class 文件作为资源获取。
其次,getName() 将包含包名,调用 Class.getResource() 将假定路径相对于类,如果它不以斜杠开头。
您需要将类名中的 '.' 替换为斜杠,并在调用 getResource() 时添加斜杠以使其正常工作。
如果您可以将 .class 文件作为资源获取,则在调用 getResource() 时还需要将 '.class' 添加到类名后面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接