本文主要是介绍JDK中Class对象的getResource方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
class对象的getResource()方法、Classloader的静态方法getSystemResource()方法和实例方法getResource()方法都是从classpath路径中获取资源,如声音,图片等。但是它们的使用却有着细微的差别。
首先从它们的源码入手,下面是它们的源码:
public java.net.URL getResource(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A system class.return ClassLoader.getSystemResource(name);}return cl.getResource(name);}
public URL getResource(String name) {URL url;if (parent != null) {url = parent.getResource(name);} else {url = getBootstrapResource(name);}if (url == null) {url = findResource(name);}return url;}
public static URL getSystemResource(String name) {ClassLoader system = getSystemClassLoader();if (system == null) {return getBootstrapResource(name);}return system.getResource(name);}从源代码中我们可以看出,Class对象的getResource()方法和ClassLoader.getSystemResource()方法都是先去获取classloader(对于获取到的classloader为 NULL时,就会按照双亲委托模型让自己的父类加载器去查找),然后调用ClassLoader对象的getResource()方法去完成资源的查找。
private String resolveName(String name) {if (name == null) {return name;}if (!name.startsWith("/")) {Class<?> c = this;while (c.isArray()) {c = c.getComponentType();}String baseName = c.getName();int index = baseName.lastIndexOf('.');if (index != -1) {name = baseName.substring(0, index).replace('.', '/')+"/"+name;}} else {name = name.substring(1);}return name;}看了resolveName(String)的源码,我们就能理解在JDK API中对此方法的解释了。
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:
如果 name 以 '/' ('\u002f') 开始,则绝对资源名是 '/' 后面的 name 的一部分。
否则,绝对名具有以下形式: modified_package_name/name
其中 modified_package_name 是此对象的包名,该名用 '/' 取代了 '.' ('\u002e')。
参数:
name - 所需资源的名称
返回:一个 URL 对象;如果找不到带有该名称的资源,则返回 null
从以下版本开始: JDK1.1
下面给出示例代码,这个示例要比对着类的组织结构来看:
Class<Test> c = Test.class; URL url = c.getResource("test.txt"); System.out.println(url); url = c.getResource("/my/slf4j/test/test.txt"); System.out.println(url); url = c.getResource("/my/slf4j/test-2.txt"); System.out.println(url);System.out.println("===============");ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); url = classLoader.getResource("my/slf4j/test-2.txt"); System.out.println(url); url = classLoader.getResource("my/slf4j/test/test.txt"); System.out.println(url);System.out.println("===============");url = ClassLoader.getSystemResource("my/slf4j/test-2.txt"); System.out.println(url); url = ClassLoader.getSystemResource("my/slf4j/test/test.txt"); System.out.println(url);
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt =============== file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt =============== file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test-2.txt file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/test/test.txt
说明:在开头我们讲了是通过classpath路径去获取资源文件,因此我们的资源文件(test.txt/test-2.txt)都是放在源文件这个目录下的,编译后他们会到xxx/bin/下的某个目录。即资源文件的路径是在classpath路径下。
这篇关于JDK中Class对象的getResource方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!