class对象的getResource()方法、Classloader的静态方法getSystemResource()方法和实例方法getResource()方法都是从classpath路径中获取资源,如声音,图片等。但是它们的使用却有着细微的差别。
首先从它们的源码入手,下面是它们的源码:
public java.URL getResource(String name) {name = resolveName(name);ClassLoader cl = getClassLoader0();if (cl==null) {// A SystemResource(name);}Resource(name);}
public URL getResource(String name) {URL url;if (parent != null) {url = Resource(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);}Resource(name);}从源代码中我们可以看出,Class对象的getResource()方法和SystemResource()方法都是先去获取classloader(对于获取到的classloader为 NULL时,就会按照双亲委托模型让自己的父类加载器去查找),然后调用ClassLoader对象的getResource()方法去完成资源的查找。 但是两者使用起来毕竟是有区别的,区别就在于Class对象的getResource()方法中的 resolveName(name);对参数name的处理。
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中对此方法的解释了。
JDK API 1.6 Class类 写道 public URL getResource(String name)查找带有给定名称的资源。查找与给定类相关的资源的规则是通过定义类的 class loader 实现的。此方法委托给此对象的类加载器。如果此对象通过引导类加载器加载,则此方法将委托给 SystemResource(java.lang.String)。
下面给出示例代码,这个示例要比对着类的组织结构来看:
Class<Test> c = Test.class; URL url = c.getResource("); System.out.println(url); url = c.getResource("/my/slf4j/"); System.out.println(url); url = c.getResource("/my/"); System.out.println(url);System.out.println("===============");ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); url = Resource("my/"); System.out.println(url); url = Resource("my/slf4j/"); System.out.println(url);System.out.println("===============");url = SystemResource("my/"); System.out.println(url); url = SystemResource("my/slf4j/"); System.out.println(url);
file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/ file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/ file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/ =============== file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/ file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/ =============== file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/ file:/E:/workspace_JavaSE/SLF4JPractice/bin/my/slf4j/
说明:在开头我们讲了是通过classpath路径去获取资源文件,因此我们的资源文件/)都是放在源文件这个目录下的,编译后他们会到xxx/bin/下的某个目录。即资源文件的路径是在classpath路径下。
本文发布于:2024-02-04 04:43:47,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170699324852158.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |