Java加载资源Class.class.getResource vs .class.getResource

两者有什么区别 ?

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

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

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

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

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