我想知道Class.getResource()和之间的区别是什么ClassLoader.getResource()?
编辑:我特别想知道文件/目录级别是否涉及任何缓存.如"在类版本中缓存的目录列表?"
以下AFAIK应该基本上做同样的事情,但它们不是:
getClass().getResource()
getClass().getClassLoader().getResource()
Run Code Online (Sandbox Code Playgroud)
我在摆弄一些报告生成代码时发现了这一点,该代码WEB-INF/classes/从该目录中的现有文件创建了一个新文件.当使用Class中的方法时,我可以找到部署时使用的文件getClass().getResource(),但在尝试获取新创建的文件时,我收到了一个null对象.浏览目录会清楚地显示新文件存在.文件名前面带有正斜杠,如"/myFile.txt"中所示.
另一方面,ClassLoader版本getResource()确实找到了生成的文件.根据这种经验,似乎存在某种目录列表的缓存.我是对的,如果是的话,这会记录在哪里?
从API文档上Class.getResource()
查找具有给定名称的资源.搜索与给定类关联的资源的规则由类的定义类加载器实现.此方法委托给此对象的类加载器.如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String).
对我来说,这是"Class.getResource真正调用它自己的类加载器的getResource()".这和做的一样getClass().getClassLoader().getResource().但显然不是.有人可以请我为此事提供一些启示吗?
我理解Class.getResource()和ClassLoader.getResource()之间有什么区别? 从自己的代码,那
getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)
是完全相同的
getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)
getClass().getClassLoader().getResource("path/image.png")
Run Code Online (Sandbox Code Playgroud)
在可执行jar文件中返回null,而
getClass().getResource("/path/image.png")
Run Code Online (Sandbox Code Playgroud)
返回正确的URL.
Since Class.getResource()代表ClassLoader.getResource()在删除前导斜杠后,我希望这些调用是相同的,但显然它们不是这种情况.即使特殊类加载器附加到特定类,每次调用它仍然应该是相同的,再次导致相同的行为.
所以,问题是:是否存在以下代码在第一次调用时返回null但第二次调用的正确URL的任何明显情况?
package com.example;
import java.net.URL;
public class ResourceTest {
public void run() {
URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png");
System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1);
URL iconUrl2 = getClass().getResource("/path/image.png");
System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2);
}
public static void main(String[] args) {
ResourceTest app = new ResourceTest();
app.run();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个需要显示图像的简单程序.我知道如何从Eclipse运行代码,我知道如何从JAR文件运行它,但我想要一个适用于这两种情况的解决方案.
Eclipse项目是这样的:
- Project (java)
- src
- controller
- Main.java
- ui
- Display.java
- images
- image.jpg
Run Code Online (Sandbox Code Playgroud)
从Eclipse中运行的代码片段:
ImageIcon image = new ImageIcon("images/image.jpg);
Run Code Online (Sandbox Code Playgroud)
适用于JAR的一个(全部在一个JAR文件中):
java.net.URL imgURL = getClass().getResource("/images/image.jpg");
ImageIcon image = new ImageIcon(imgURL);
Run Code Online (Sandbox Code Playgroud)
为了获得在两种情况下都能工作的单个代码,我需要更改什么?