英文:
Why is getResource or getResourceAsStream method placed in Class.java?
问题
我看的方式是,这些方法被用于获取一个资源并返回相应的对象。那么为什么把它们放在Class.java中呢?它们并没有提供任何关于类的信息或元数据,那为什么不把它放在'class'类中,而不是IO包中呢?
英文:
The way I see it, these methods are used to fetch a resource and return the respective object. So why are they placed in Class.java? They're not providing any information or metadata about the class then why put it in 'class' class and not in IO package?
答案1
得分: 3
<sup>我只会在这里提到`getResource`,但是所有内容同样适用于`getResourceAsStream`。</sup>
这些方法涉及加载与您的类捆绑的资源,因此它们与`Class`的功能*某种程度上*相关。但确实有一个地方它们更合适。那就是`ClassLoader`。
实际上,存在一个名为[a `ClassLoader.getResource` 方法][1]的方法,它看起来与[同名的 `Class` 版本][2]非常相似。
事实上,这两种方法之间的主要区别在于,如果请求的资源名称不以`/`开头,`Class` 版本将在所请求的资源名称前添加修改后的包名称。
这意味着 `mypackage.MyClass.class.getResource("foo")`(几乎相等,但不完全相等)于 `mypackage.MyClass.class.getClassLoader().getResource("mypackage/foo")`。这使得 `Class` 版本非常适用于加载与给定类密切相关的资源(可以说是“位于同一个包中”,尽管从技术上讲不完全准确)。
[1]: http://是的,有一个更适合此类方法的地方,就是那里
[2]: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Class.html#getResource(java.lang.String)
英文:
<sup>I'll only mention getResource
here, but everything equally applies to getResourceAsStream
.</sup>
Those methods are about loading resources that are bundled with your classes, so they are somewhat related to what Class
does. But there is indeed a place where they would fit better. And that is ClassLoader
.
And in fact, there is a ClassLoader.getResource
method that looks awfully similar to the Class
version of the same name.
In fact the major difference between those two methods is that the Class
version will prepend the modified package name to the front of the requested resource name, if it doesn't start with /
.
That means that mypackage.MyClass.class.getResource("foo")
is (almost, but not quite) equivalent to mypackage.MyClass.class.getClassLoader().getResource("mypackage/foo")
. This makes the Class
version very useful to load resources that are tightly related to a given class (one could say "are in the same package", except that's not quite technically true).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论