Java加载资源Class.class.getResource vs <classname> .class.getResource </classname>

时间:2011-07-25 23:23:53

标签: java resources resourcebundle classloader

两者有什么区别?

我的资源文件打包在根级别包中。并且调用Class.class.getResource(“/ rec.txt”)似乎适用于我测试的特定情况。但是,当我尝试在更大的环境(hadoop)中使用此jar作为依赖时,这不起作用(返回null)。但是,将“Class”更改为代码中的任何特定类修复它。有人会抛出一些光。

2 个答案:

答案 0 :(得分:3)

发生这种情况的原因是getResource的工作方式。它基本上将调用委托给<classname>的classLoader,并将其置于您的问题中。

Class对象可能是由企业应用程序中的bootstrap类加载器加载的,而您的类<classname>是由不同的类加载器加载的。

答案 1 :(得分:0)

Class.getResource()通过将相关路径附加到您调用getResource()的类的路径来解析相对路径。路径是相对的,除非它以“/”开头,在这种情况下,它是针对类路径的根解析的。 ClassLoader.getResource()将所有路径解析为绝对路径,但您不能在路径前加上“/”。这就是它的全部,真的。如果任一方法返回null,则表示该资源不存在。

编辑:哦,对不起。我没有仔细阅读你的问题而错过了课堂与课堂部分。您正在寻找的区别是通过类加载资源委托给其关联的ClassLoader。我不太了解Hadoop如何设置其ClassLoader,但java.lang.Class类将由引导程序ClassLoader加载,几乎可以肯定,引导程序ClassLoader在其类路径中没有任何jar,所以它无法找到其中定义的任何资源。但是,您自己的类必须由可以访问您的jar的ClassLoader加载,因此可以加载您的资源。