JDK中Class对象的getResource方法

阅读: 评论:0

JDK中Class对象的getResource方法

JDK中Class对象的getResource方法

  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)。
在委托前,使用下面的算法从给定的资源名构造一个绝对资源名:

如果 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(&#");
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小时内删除。

标签:对象   方法   JDK   Class   getResource
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23